From bf2c02e2409332f491c52dc9b1f908c12dcf876c Mon Sep 17 00:00:00 2001 From: "Grayson Riffe (Desktop)" Date: Mon, 27 Sep 2021 23:00:04 -0500 Subject: [PATCH] Fixed crash; Added dev screenshot; Added dependencies into repository --- .gitignore | 1 - DevScreenshots/13. Faster Renderer.png | Bin 0 -> 694019 bytes Game/src/MainState.cpp | 14 +- Game/src/include/MainState.h | 2 +- .../base/shaders/lightingFragment.shader | 25 +- .../AssetBuild/example/models/normal.mtl | 2 +- NothinFancy/dep/include/GL/eglew.h | 2618 ++ NothinFancy/dep/include/GL/glew.h | 23686 ++++++++++++++++ NothinFancy/dep/include/GL/glxew.h | 1775 ++ NothinFancy/dep/include/GL/wglew.h | 1447 + .../dep/include/freetype/config/ftconfig.h | 51 + .../dep/include/freetype/config/ftheader.h | 824 + .../dep/include/freetype/config/ftmodule.h | 32 + .../dep/include/freetype/config/ftoption.h | 1011 + .../dep/include/freetype/config/ftstdlib.h | 175 + .../include/freetype/config/integer-types.h | 245 + .../dep/include/freetype/config/mac-support.h | 49 + .../include/freetype/config/public-macros.h | 120 + NothinFancy/dep/include/freetype/freetype.h | 4833 ++++ NothinFancy/dep/include/freetype/ftadvanc.h | 188 + NothinFancy/dep/include/freetype/ftbbox.h | 101 + NothinFancy/dep/include/freetype/ftbdf.h | 212 + NothinFancy/dep/include/freetype/ftbitmap.h | 329 + NothinFancy/dep/include/freetype/ftbzip2.h | 102 + NothinFancy/dep/include/freetype/ftcache.h | 1087 + NothinFancy/dep/include/freetype/ftchapters.h | 147 + NothinFancy/dep/include/freetype/ftcid.h | 167 + NothinFancy/dep/include/freetype/ftcolor.h | 1609 ++ NothinFancy/dep/include/freetype/ftdriver.h | 1193 + NothinFancy/dep/include/freetype/fterrdef.h | 279 + NothinFancy/dep/include/freetype/fterrors.h | 296 + NothinFancy/dep/include/freetype/ftfntfmt.h | 93 + NothinFancy/dep/include/freetype/ftgasp.h | 143 + NothinFancy/dep/include/freetype/ftglyph.h | 664 + NothinFancy/dep/include/freetype/ftgxval.h | 354 + NothinFancy/dep/include/freetype/ftgzip.h | 151 + NothinFancy/dep/include/freetype/ftimage.h | 1276 + NothinFancy/dep/include/freetype/ftincrem.h | 348 + NothinFancy/dep/include/freetype/ftlcdfil.h | 323 + NothinFancy/dep/include/freetype/ftlist.h | 296 + NothinFancy/dep/include/freetype/ftlogging.h | 184 + NothinFancy/dep/include/freetype/ftlzw.h | 100 + NothinFancy/dep/include/freetype/ftmac.h | 289 + NothinFancy/dep/include/freetype/ftmm.h | 752 + NothinFancy/dep/include/freetype/ftmodapi.h | 806 + NothinFancy/dep/include/freetype/ftmoderr.h | 204 + NothinFancy/dep/include/freetype/ftotval.h | 206 + NothinFancy/dep/include/freetype/ftoutln.h | 586 + NothinFancy/dep/include/freetype/ftparams.h | 203 + NothinFancy/dep/include/freetype/ftpfr.h | 179 + NothinFancy/dep/include/freetype/ftrender.h | 244 + NothinFancy/dep/include/freetype/ftsizes.h | 159 + NothinFancy/dep/include/freetype/ftsnames.h | 272 + NothinFancy/dep/include/freetype/ftstroke.h | 773 + NothinFancy/dep/include/freetype/ftsynth.h | 83 + NothinFancy/dep/include/freetype/ftsystem.h | 352 + NothinFancy/dep/include/freetype/fttrigon.h | 350 + NothinFancy/dep/include/freetype/fttypes.h | 615 + NothinFancy/dep/include/freetype/ftwinfnt.h | 276 + NothinFancy/dep/include/freetype/t1tables.h | 773 + NothinFancy/dep/include/freetype/ttnameid.h | 1235 + NothinFancy/dep/include/freetype/tttables.h | 855 + NothinFancy/dep/include/freetype/tttags.h | 123 + NothinFancy/dep/include/ft2build.h | 42 + NothinFancy/dep/include/glm/CMakeLists.txt | 70 + NothinFancy/dep/include/glm/common.hpp | 539 + .../dep/include/glm/detail/_features.hpp | 394 + NothinFancy/dep/include/glm/detail/_fixes.hpp | 27 + NothinFancy/dep/include/glm/detail/_noise.hpp | 81 + .../dep/include/glm/detail/_swizzle.hpp | 804 + .../dep/include/glm/detail/_swizzle_func.hpp | 682 + .../dep/include/glm/detail/_vectorize.hpp | 162 + .../dep/include/glm/detail/compute_common.hpp | 50 + .../glm/detail/compute_vector_relational.hpp | 30 + .../dep/include/glm/detail/func_common.inl | 792 + .../include/glm/detail/func_common_simd.inl | 231 + .../include/glm/detail/func_exponential.inl | 152 + .../glm/detail/func_exponential_simd.inl | 37 + .../dep/include/glm/detail/func_geometric.inl | 243 + .../glm/detail/func_geometric_simd.inl | 163 + .../dep/include/glm/detail/func_integer.inl | 372 + .../include/glm/detail/func_integer_simd.inl | 65 + .../dep/include/glm/detail/func_matrix.inl | 398 + .../include/glm/detail/func_matrix_simd.inl | 249 + .../dep/include/glm/detail/func_packing.inl | 189 + .../include/glm/detail/func_packing_simd.inl | 6 + .../include/glm/detail/func_trigonometric.inl | 197 + .../glm/detail/func_trigonometric_simd.inl | 0 .../glm/detail/func_vector_relational.inl | 87 + .../detail/func_vector_relational_simd.inl | 6 + NothinFancy/dep/include/glm/detail/glm.cpp | 263 + .../dep/include/glm/detail/qualifier.hpp | 230 + NothinFancy/dep/include/glm/detail/setup.hpp | 1135 + .../dep/include/glm/detail/type_float.hpp | 68 + .../dep/include/glm/detail/type_half.hpp | 16 + .../dep/include/glm/detail/type_half.inl | 241 + .../dep/include/glm/detail/type_mat2x2.hpp | 177 + .../dep/include/glm/detail/type_mat2x2.inl | 536 + .../dep/include/glm/detail/type_mat2x3.hpp | 159 + .../dep/include/glm/detail/type_mat2x3.inl | 510 + .../dep/include/glm/detail/type_mat2x4.hpp | 161 + .../dep/include/glm/detail/type_mat2x4.inl | 520 + .../dep/include/glm/detail/type_mat3x2.hpp | 167 + .../dep/include/glm/detail/type_mat3x2.inl | 532 + .../dep/include/glm/detail/type_mat3x3.hpp | 184 + .../dep/include/glm/detail/type_mat3x3.inl | 601 + .../dep/include/glm/detail/type_mat3x4.hpp | 166 + .../dep/include/glm/detail/type_mat3x4.inl | 578 + .../dep/include/glm/detail/type_mat4x2.hpp | 171 + .../dep/include/glm/detail/type_mat4x2.inl | 574 + .../dep/include/glm/detail/type_mat4x3.hpp | 171 + .../dep/include/glm/detail/type_mat4x3.inl | 598 + .../dep/include/glm/detail/type_mat4x4.hpp | 189 + .../dep/include/glm/detail/type_mat4x4.inl | 706 + .../include/glm/detail/type_mat4x4_simd.inl | 6 + .../dep/include/glm/detail/type_quat.hpp | 186 + .../dep/include/glm/detail/type_quat.inl | 408 + .../dep/include/glm/detail/type_quat_simd.inl | 188 + .../dep/include/glm/detail/type_vec1.hpp | 308 + .../dep/include/glm/detail/type_vec1.inl | 551 + .../dep/include/glm/detail/type_vec2.hpp | 399 + .../dep/include/glm/detail/type_vec2.inl | 913 + .../dep/include/glm/detail/type_vec3.hpp | 432 + .../dep/include/glm/detail/type_vec3.inl | 1068 + .../dep/include/glm/detail/type_vec4.hpp | 505 + .../dep/include/glm/detail/type_vec4.inl | 1140 + .../dep/include/glm/detail/type_vec4_simd.inl | 775 + NothinFancy/dep/include/glm/exponential.hpp | 110 + NothinFancy/dep/include/glm/ext.hpp | 253 + .../dep/include/glm/ext/matrix_clip_space.hpp | 522 + .../dep/include/glm/ext/matrix_clip_space.inl | 555 + .../dep/include/glm/ext/matrix_common.hpp | 36 + .../dep/include/glm/ext/matrix_common.inl | 16 + .../dep/include/glm/ext/matrix_double2x2.hpp | 23 + .../glm/ext/matrix_double2x2_precision.hpp | 49 + .../dep/include/glm/ext/matrix_double2x3.hpp | 18 + .../glm/ext/matrix_double2x3_precision.hpp | 31 + .../dep/include/glm/ext/matrix_double2x4.hpp | 18 + .../glm/ext/matrix_double2x4_precision.hpp | 31 + .../dep/include/glm/ext/matrix_double3x2.hpp | 18 + .../glm/ext/matrix_double3x2_precision.hpp | 31 + .../dep/include/glm/ext/matrix_double3x3.hpp | 23 + .../glm/ext/matrix_double3x3_precision.hpp | 49 + .../dep/include/glm/ext/matrix_double3x4.hpp | 18 + .../glm/ext/matrix_double3x4_precision.hpp | 31 + .../dep/include/glm/ext/matrix_double4x2.hpp | 18 + .../glm/ext/matrix_double4x2_precision.hpp | 31 + .../dep/include/glm/ext/matrix_double4x3.hpp | 18 + .../glm/ext/matrix_double4x3_precision.hpp | 31 + .../dep/include/glm/ext/matrix_double4x4.hpp | 23 + .../glm/ext/matrix_double4x4_precision.hpp | 49 + .../dep/include/glm/ext/matrix_float2x2.hpp | 23 + .../glm/ext/matrix_float2x2_precision.hpp | 49 + .../dep/include/glm/ext/matrix_float2x3.hpp | 18 + .../glm/ext/matrix_float2x3_precision.hpp | 31 + .../dep/include/glm/ext/matrix_float2x4.hpp | 18 + .../glm/ext/matrix_float2x4_precision.hpp | 31 + .../dep/include/glm/ext/matrix_float3x2.hpp | 18 + .../glm/ext/matrix_float3x2_precision.hpp | 31 + .../dep/include/glm/ext/matrix_float3x3.hpp | 23 + .../glm/ext/matrix_float3x3_precision.hpp | 49 + .../dep/include/glm/ext/matrix_float3x4.hpp | 18 + .../glm/ext/matrix_float3x4_precision.hpp | 31 + .../dep/include/glm/ext/matrix_float4x2.hpp | 18 + .../glm/ext/matrix_float4x2_precision.hpp | 31 + .../dep/include/glm/ext/matrix_float4x3.hpp | 18 + .../glm/ext/matrix_float4x3_precision.hpp | 31 + .../dep/include/glm/ext/matrix_float4x4.hpp | 23 + .../glm/ext/matrix_float4x4_precision.hpp | 49 + .../dep/include/glm/ext/matrix_int2x2.hpp | 38 + .../include/glm/ext/matrix_int2x2_sized.hpp | 70 + .../dep/include/glm/ext/matrix_int2x3.hpp | 33 + .../include/glm/ext/matrix_int2x3_sized.hpp | 49 + .../dep/include/glm/ext/matrix_int2x4.hpp | 33 + .../include/glm/ext/matrix_int2x4_sized.hpp | 49 + .../dep/include/glm/ext/matrix_int3x2.hpp | 33 + .../include/glm/ext/matrix_int3x2_sized.hpp | 49 + .../dep/include/glm/ext/matrix_int3x3.hpp | 38 + .../include/glm/ext/matrix_int3x3_sized.hpp | 70 + .../dep/include/glm/ext/matrix_int3x4.hpp | 33 + .../include/glm/ext/matrix_int3x4_sized.hpp | 49 + .../dep/include/glm/ext/matrix_int4x2.hpp | 33 + .../include/glm/ext/matrix_int4x2_sized.hpp | 49 + .../dep/include/glm/ext/matrix_int4x3.hpp | 33 + .../include/glm/ext/matrix_int4x3_sized.hpp | 49 + .../dep/include/glm/ext/matrix_int4x4.hpp | 38 + .../include/glm/ext/matrix_int4x4_sized.hpp | 70 + .../dep/include/glm/ext/matrix_projection.hpp | 149 + .../dep/include/glm/ext/matrix_projection.inl | 106 + .../dep/include/glm/ext/matrix_relational.hpp | 132 + .../dep/include/glm/ext/matrix_relational.inl | 82 + .../dep/include/glm/ext/matrix_transform.hpp | 144 + .../dep/include/glm/ext/matrix_transform.inl | 152 + .../dep/include/glm/ext/matrix_uint2x2.hpp | 38 + .../include/glm/ext/matrix_uint2x2_sized.hpp | 70 + .../dep/include/glm/ext/matrix_uint2x3.hpp | 33 + .../include/glm/ext/matrix_uint2x3_sized.hpp | 49 + .../dep/include/glm/ext/matrix_uint2x4.hpp | 33 + .../include/glm/ext/matrix_uint2x4_sized.hpp | 49 + .../dep/include/glm/ext/matrix_uint3x2.hpp | 33 + .../include/glm/ext/matrix_uint3x2_sized.hpp | 49 + .../dep/include/glm/ext/matrix_uint3x3.hpp | 38 + .../include/glm/ext/matrix_uint3x3_sized.hpp | 70 + .../dep/include/glm/ext/matrix_uint3x4.hpp | 33 + .../include/glm/ext/matrix_uint3x4_sized.hpp | 49 + .../dep/include/glm/ext/matrix_uint4x2.hpp | 33 + .../include/glm/ext/matrix_uint4x2_sized.hpp | 49 + .../dep/include/glm/ext/matrix_uint4x3.hpp | 33 + .../include/glm/ext/matrix_uint4x3_sized.hpp | 49 + .../dep/include/glm/ext/matrix_uint4x4.hpp | 38 + .../include/glm/ext/matrix_uint4x4_sized.hpp | 70 + .../dep/include/glm/ext/quaternion_common.hpp | 135 + .../dep/include/glm/ext/quaternion_common.inl | 144 + .../glm/ext/quaternion_common_simd.inl | 18 + .../dep/include/glm/ext/quaternion_double.hpp | 39 + .../glm/ext/quaternion_double_precision.hpp | 42 + .../glm/ext/quaternion_exponential.hpp | 63 + .../glm/ext/quaternion_exponential.inl | 85 + .../dep/include/glm/ext/quaternion_float.hpp | 39 + .../glm/ext/quaternion_float_precision.hpp | 36 + .../include/glm/ext/quaternion_geometric.hpp | 70 + .../include/glm/ext/quaternion_geometric.inl | 36 + .../include/glm/ext/quaternion_relational.hpp | 62 + .../include/glm/ext/quaternion_relational.inl | 35 + .../include/glm/ext/quaternion_transform.hpp | 47 + .../include/glm/ext/quaternion_transform.inl | 24 + .../glm/ext/quaternion_trigonometric.hpp | 63 + .../glm/ext/quaternion_trigonometric.inl | 34 + .../dep/include/glm/ext/scalar_common.hpp | 157 + .../dep/include/glm/ext/scalar_common.inl | 152 + .../dep/include/glm/ext/scalar_constants.hpp | 40 + .../dep/include/glm/ext/scalar_constants.inl | 24 + .../dep/include/glm/ext/scalar_int_sized.hpp | 70 + .../dep/include/glm/ext/scalar_integer.hpp | 92 + .../dep/include/glm/ext/scalar_integer.inl | 243 + .../dep/include/glm/ext/scalar_packing.hpp | 32 + .../dep/include/glm/ext/scalar_packing.inl | 0 .../dep/include/glm/ext/scalar_relational.hpp | 65 + .../dep/include/glm/ext/scalar_relational.inl | 40 + .../dep/include/glm/ext/scalar_uint_sized.hpp | 70 + .../dep/include/glm/ext/scalar_ulp.hpp | 74 + .../dep/include/glm/ext/scalar_ulp.inl | 284 + .../dep/include/glm/ext/vector_bool1.hpp | 30 + .../glm/ext/vector_bool1_precision.hpp | 34 + .../dep/include/glm/ext/vector_bool2.hpp | 18 + .../glm/ext/vector_bool2_precision.hpp | 31 + .../dep/include/glm/ext/vector_bool3.hpp | 18 + .../glm/ext/vector_bool3_precision.hpp | 31 + .../dep/include/glm/ext/vector_bool4.hpp | 18 + .../glm/ext/vector_bool4_precision.hpp | 31 + .../dep/include/glm/ext/vector_common.hpp | 204 + .../dep/include/glm/ext/vector_common.inl | 129 + .../dep/include/glm/ext/vector_double1.hpp | 31 + .../glm/ext/vector_double1_precision.hpp | 36 + .../dep/include/glm/ext/vector_double2.hpp | 18 + .../glm/ext/vector_double2_precision.hpp | 31 + .../dep/include/glm/ext/vector_double3.hpp | 18 + .../glm/ext/vector_double3_precision.hpp | 34 + .../dep/include/glm/ext/vector_double4.hpp | 18 + .../glm/ext/vector_double4_precision.hpp | 35 + .../dep/include/glm/ext/vector_float1.hpp | 31 + .../glm/ext/vector_float1_precision.hpp | 36 + .../dep/include/glm/ext/vector_float2.hpp | 18 + .../glm/ext/vector_float2_precision.hpp | 31 + .../dep/include/glm/ext/vector_float3.hpp | 18 + .../glm/ext/vector_float3_precision.hpp | 31 + .../dep/include/glm/ext/vector_float4.hpp | 18 + .../glm/ext/vector_float4_precision.hpp | 31 + .../dep/include/glm/ext/vector_int1.hpp | 32 + .../dep/include/glm/ext/vector_int1_sized.hpp | 49 + .../dep/include/glm/ext/vector_int2.hpp | 18 + .../dep/include/glm/ext/vector_int2_sized.hpp | 49 + .../dep/include/glm/ext/vector_int3.hpp | 18 + .../dep/include/glm/ext/vector_int3_sized.hpp | 49 + .../dep/include/glm/ext/vector_int4.hpp | 18 + .../dep/include/glm/ext/vector_int4_sized.hpp | 49 + .../dep/include/glm/ext/vector_integer.hpp | 149 + .../dep/include/glm/ext/vector_integer.inl | 85 + .../dep/include/glm/ext/vector_packing.hpp | 32 + .../dep/include/glm/ext/vector_packing.inl | 0 .../dep/include/glm/ext/vector_relational.hpp | 107 + .../dep/include/glm/ext/vector_relational.inl | 75 + .../dep/include/glm/ext/vector_uint1.hpp | 32 + .../include/glm/ext/vector_uint1_sized.hpp | 49 + .../dep/include/glm/ext/vector_uint2.hpp | 18 + .../include/glm/ext/vector_uint2_sized.hpp | 49 + .../dep/include/glm/ext/vector_uint3.hpp | 18 + .../include/glm/ext/vector_uint3_sized.hpp | 49 + .../dep/include/glm/ext/vector_uint4.hpp | 18 + .../include/glm/ext/vector_uint4_sized.hpp | 49 + .../dep/include/glm/ext/vector_ulp.hpp | 109 + .../dep/include/glm/ext/vector_ulp.inl | 74 + NothinFancy/dep/include/glm/fwd.hpp | 1233 + NothinFancy/dep/include/glm/geometric.hpp | 116 + NothinFancy/dep/include/glm/glm.hpp | 136 + NothinFancy/dep/include/glm/gtc/bitfield.hpp | 266 + NothinFancy/dep/include/glm/gtc/bitfield.inl | 626 + .../dep/include/glm/gtc/color_space.hpp | 56 + .../dep/include/glm/gtc/color_space.inl | 84 + NothinFancy/dep/include/glm/gtc/constants.hpp | 165 + NothinFancy/dep/include/glm/gtc/constants.inl | 167 + NothinFancy/dep/include/glm/gtc/epsilon.hpp | 60 + NothinFancy/dep/include/glm/gtc/epsilon.inl | 80 + NothinFancy/dep/include/glm/gtc/integer.hpp | 65 + NothinFancy/dep/include/glm/gtc/integer.inl | 68 + .../dep/include/glm/gtc/matrix_access.hpp | 60 + .../dep/include/glm/gtc/matrix_access.inl | 62 + .../dep/include/glm/gtc/matrix_integer.hpp | 433 + .../dep/include/glm/gtc/matrix_inverse.hpp | 50 + .../dep/include/glm/gtc/matrix_inverse.inl | 118 + .../dep/include/glm/gtc/matrix_transform.hpp | 36 + .../dep/include/glm/gtc/matrix_transform.inl | 3 + NothinFancy/dep/include/glm/gtc/noise.hpp | 61 + NothinFancy/dep/include/glm/gtc/noise.inl | 807 + NothinFancy/dep/include/glm/gtc/packing.hpp | 728 + NothinFancy/dep/include/glm/gtc/packing.inl | 938 + .../dep/include/glm/gtc/quaternion.hpp | 173 + .../dep/include/glm/gtc/quaternion.inl | 202 + .../dep/include/glm/gtc/quaternion_simd.inl | 0 NothinFancy/dep/include/glm/gtc/random.hpp | 82 + NothinFancy/dep/include/glm/gtc/random.inl | 303 + .../dep/include/glm/gtc/reciprocal.hpp | 135 + .../dep/include/glm/gtc/reciprocal.inl | 191 + NothinFancy/dep/include/glm/gtc/round.hpp | 160 + NothinFancy/dep/include/glm/gtc/round.inl | 155 + .../dep/include/glm/gtc/type_aligned.hpp | 1315 + .../dep/include/glm/gtc/type_precision.hpp | 2094 ++ .../dep/include/glm/gtc/type_precision.inl | 6 + NothinFancy/dep/include/glm/gtc/type_ptr.hpp | 230 + NothinFancy/dep/include/glm/gtc/type_ptr.inl | 386 + NothinFancy/dep/include/glm/gtc/ulp.hpp | 152 + NothinFancy/dep/include/glm/gtc/ulp.inl | 173 + NothinFancy/dep/include/glm/gtc/vec1.hpp | 30 + .../include/glm/gtx/associated_min_max.hpp | 207 + .../include/glm/gtx/associated_min_max.inl | 354 + NothinFancy/dep/include/glm/gtx/bit.hpp | 98 + NothinFancy/dep/include/glm/gtx/bit.inl | 92 + .../dep/include/glm/gtx/closest_point.hpp | 49 + .../dep/include/glm/gtx/closest_point.inl | 45 + .../dep/include/glm/gtx/color_encoding.hpp | 54 + .../dep/include/glm/gtx/color_encoding.inl | 45 + .../dep/include/glm/gtx/color_space.hpp | 72 + .../dep/include/glm/gtx/color_space.inl | 141 + .../dep/include/glm/gtx/color_space_YCoCg.hpp | 60 + .../dep/include/glm/gtx/color_space_YCoCg.inl | 107 + NothinFancy/dep/include/glm/gtx/common.hpp | 76 + NothinFancy/dep/include/glm/gtx/common.inl | 125 + .../dep/include/glm/gtx/compatibility.hpp | 133 + .../dep/include/glm/gtx/compatibility.inl | 62 + .../dep/include/glm/gtx/component_wise.hpp | 69 + .../dep/include/glm/gtx/component_wise.inl | 127 + .../dep/include/glm/gtx/dual_quaternion.hpp | 274 + .../dep/include/glm/gtx/dual_quaternion.inl | 352 + NothinFancy/dep/include/glm/gtx/easing.hpp | 219 + NothinFancy/dep/include/glm/gtx/easing.inl | 436 + .../dep/include/glm/gtx/euler_angles.hpp | 335 + .../dep/include/glm/gtx/euler_angles.inl | 899 + NothinFancy/dep/include/glm/gtx/extend.hpp | 42 + NothinFancy/dep/include/glm/gtx/extend.inl | 48 + .../dep/include/glm/gtx/extended_min_max.hpp | 137 + .../dep/include/glm/gtx/extended_min_max.inl | 138 + .../dep/include/glm/gtx/exterior_product.hpp | 45 + .../dep/include/glm/gtx/exterior_product.inl | 26 + .../dep/include/glm/gtx/fast_exponential.hpp | 95 + .../dep/include/glm/gtx/fast_exponential.inl | 136 + .../dep/include/glm/gtx/fast_square_root.hpp | 92 + .../dep/include/glm/gtx/fast_square_root.inl | 75 + .../dep/include/glm/gtx/fast_trigonometry.hpp | 79 + .../dep/include/glm/gtx/fast_trigonometry.inl | 142 + .../dep/include/glm/gtx/float_notmalize.inl | 13 + NothinFancy/dep/include/glm/gtx/functions.hpp | 56 + NothinFancy/dep/include/glm/gtx/functions.inl | 30 + .../dep/include/glm/gtx/gradient_paint.hpp | 53 + .../dep/include/glm/gtx/gradient_paint.inl | 36 + .../glm/gtx/handed_coordinate_space.hpp | 50 + .../glm/gtx/handed_coordinate_space.inl | 26 + NothinFancy/dep/include/glm/gtx/hash.hpp | 142 + NothinFancy/dep/include/glm/gtx/hash.inl | 184 + NothinFancy/dep/include/glm/gtx/integer.hpp | 76 + NothinFancy/dep/include/glm/gtx/integer.inl | 185 + NothinFancy/dep/include/glm/gtx/intersect.hpp | 92 + NothinFancy/dep/include/glm/gtx/intersect.inl | 200 + NothinFancy/dep/include/glm/gtx/io.hpp | 201 + NothinFancy/dep/include/glm/gtx/io.inl | 440 + NothinFancy/dep/include/glm/gtx/log_base.hpp | 48 + NothinFancy/dep/include/glm/gtx/log_base.inl | 16 + .../include/glm/gtx/matrix_cross_product.hpp | 47 + .../include/glm/gtx/matrix_cross_product.inl | 37 + .../dep/include/glm/gtx/matrix_decompose.hpp | 46 + .../dep/include/glm/gtx/matrix_decompose.inl | 186 + .../include/glm/gtx/matrix_factorisation.hpp | 69 + .../include/glm/gtx/matrix_factorisation.inl | 84 + .../include/glm/gtx/matrix_interpolation.hpp | 60 + .../include/glm/gtx/matrix_interpolation.inl | 129 + .../include/glm/gtx/matrix_major_storage.hpp | 119 + .../include/glm/gtx/matrix_major_storage.inl | 166 + .../dep/include/glm/gtx/matrix_operation.hpp | 103 + .../dep/include/glm/gtx/matrix_operation.inl | 176 + .../dep/include/glm/gtx/matrix_query.hpp | 77 + .../dep/include/glm/gtx/matrix_query.inl | 113 + .../include/glm/gtx/matrix_transform_2d.hpp | 81 + .../include/glm/gtx/matrix_transform_2d.inl | 68 + .../dep/include/glm/gtx/mixed_product.hpp | 41 + .../dep/include/glm/gtx/mixed_product.inl | 15 + NothinFancy/dep/include/glm/gtx/norm.hpp | 88 + NothinFancy/dep/include/glm/gtx/norm.inl | 95 + NothinFancy/dep/include/glm/gtx/normal.hpp | 41 + NothinFancy/dep/include/glm/gtx/normal.inl | 15 + .../dep/include/glm/gtx/normalize_dot.hpp | 49 + .../dep/include/glm/gtx/normalize_dot.inl | 16 + .../dep/include/glm/gtx/number_precision.hpp | 61 + .../dep/include/glm/gtx/number_precision.inl | 6 + .../dep/include/glm/gtx/optimum_pow.hpp | 54 + .../dep/include/glm/gtx/optimum_pow.inl | 22 + .../dep/include/glm/gtx/orthonormalize.hpp | 49 + .../dep/include/glm/gtx/orthonormalize.inl | 29 + .../dep/include/glm/gtx/perpendicular.hpp | 41 + .../dep/include/glm/gtx/perpendicular.inl | 10 + .../dep/include/glm/gtx/polar_coordinates.hpp | 48 + .../dep/include/glm/gtx/polar_coordinates.inl | 36 + .../dep/include/glm/gtx/projection.hpp | 43 + .../dep/include/glm/gtx/projection.inl | 10 + .../dep/include/glm/gtx/quaternion.hpp | 174 + .../dep/include/glm/gtx/quaternion.inl | 159 + NothinFancy/dep/include/glm/gtx/range.hpp | 98 + NothinFancy/dep/include/glm/gtx/raw_data.hpp | 51 + NothinFancy/dep/include/glm/gtx/raw_data.inl | 2 + .../glm/gtx/rotate_normalized_axis.hpp | 68 + .../glm/gtx/rotate_normalized_axis.inl | 58 + .../dep/include/glm/gtx/rotate_vector.hpp | 123 + .../dep/include/glm/gtx/rotate_vector.inl | 187 + .../include/glm/gtx/scalar_multiplication.hpp | 75 + .../dep/include/glm/gtx/scalar_relational.hpp | 36 + .../dep/include/glm/gtx/scalar_relational.inl | 88 + NothinFancy/dep/include/glm/gtx/spline.hpp | 65 + NothinFancy/dep/include/glm/gtx/spline.inl | 60 + .../dep/include/glm/gtx/std_based_type.hpp | 68 + .../dep/include/glm/gtx/std_based_type.inl | 6 + .../dep/include/glm/gtx/string_cast.hpp | 52 + .../dep/include/glm/gtx/string_cast.inl | 492 + NothinFancy/dep/include/glm/gtx/texture.hpp | 46 + NothinFancy/dep/include/glm/gtx/texture.inl | 17 + NothinFancy/dep/include/glm/gtx/transform.hpp | 60 + NothinFancy/dep/include/glm/gtx/transform.inl | 23 + .../dep/include/glm/gtx/transform2.hpp | 89 + .../dep/include/glm/gtx/transform2.inl | 125 + .../dep/include/glm/gtx/type_aligned.hpp | 982 + .../dep/include/glm/gtx/type_aligned.inl | 6 + .../dep/include/glm/gtx/type_trait.hpp | 85 + .../dep/include/glm/gtx/type_trait.inl | 61 + .../dep/include/glm/gtx/vec_swizzle.hpp | 2782 ++ .../dep/include/glm/gtx/vector_angle.hpp | 57 + .../dep/include/glm/gtx/vector_angle.inl | 44 + .../dep/include/glm/gtx/vector_query.hpp | 66 + .../dep/include/glm/gtx/vector_query.inl | 154 + NothinFancy/dep/include/glm/gtx/wrap.hpp | 37 + NothinFancy/dep/include/glm/gtx/wrap.inl | 6 + NothinFancy/dep/include/glm/integer.hpp | 212 + NothinFancy/dep/include/glm/mat2x2.hpp | 9 + NothinFancy/dep/include/glm/mat2x3.hpp | 9 + NothinFancy/dep/include/glm/mat2x4.hpp | 9 + NothinFancy/dep/include/glm/mat3x2.hpp | 9 + NothinFancy/dep/include/glm/mat3x3.hpp | 8 + NothinFancy/dep/include/glm/mat3x4.hpp | 8 + NothinFancy/dep/include/glm/mat4x2.hpp | 9 + NothinFancy/dep/include/glm/mat4x3.hpp | 8 + NothinFancy/dep/include/glm/mat4x4.hpp | 9 + NothinFancy/dep/include/glm/matrix.hpp | 161 + NothinFancy/dep/include/glm/packing.hpp | 173 + NothinFancy/dep/include/glm/simd/common.h | 240 + .../dep/include/glm/simd/exponential.h | 20 + NothinFancy/dep/include/glm/simd/geometric.h | 124 + NothinFancy/dep/include/glm/simd/integer.h | 115 + NothinFancy/dep/include/glm/simd/matrix.h | 1028 + NothinFancy/dep/include/glm/simd/neon.h | 155 + NothinFancy/dep/include/glm/simd/packing.h | 8 + NothinFancy/dep/include/glm/simd/platform.h | 398 + .../dep/include/glm/simd/trigonometric.h | 9 + .../dep/include/glm/simd/vector_relational.h | 8 + NothinFancy/dep/include/glm/trigonometric.hpp | 210 + NothinFancy/dep/include/glm/vec2.hpp | 14 + NothinFancy/dep/include/glm/vec3.hpp | 14 + NothinFancy/dep/include/glm/vec4.hpp | 15 + .../dep/include/glm/vector_relational.hpp | 121 + NothinFancy/dep/include/stb_image.h | 7897 ++++++ NothinFancy/dep/lib/freetype.lib | Bin 0 -> 3689862 bytes NothinFancy/dep/lib/glew32s.lib | Bin 0 -> 2443636 bytes NothinFancy/src/Gamestate.cpp | 5 + NothinFancy/src/NFObject/Button.cpp | 23 +- NothinFancy/src/NFObject/Cubemap.cpp | 6 +- NothinFancy/src/NFObject/Entity.cpp | 7 +- NothinFancy/src/NFObject/Sound.cpp | 9 +- NothinFancy/src/NFObject/Text.cpp | 10 +- NothinFancy/src/NFObject/UITexture.cpp | 11 +- NothinFancy/src/include/Gamestate.h | 4 + NothinFancy/src/include/NothinFancy.h | 1 + 496 files changed, 126276 insertions(+), 56 deletions(-) create mode 100644 DevScreenshots/13. Faster Renderer.png create mode 100644 NothinFancy/dep/include/GL/eglew.h create mode 100644 NothinFancy/dep/include/GL/glew.h create mode 100644 NothinFancy/dep/include/GL/glxew.h create mode 100644 NothinFancy/dep/include/GL/wglew.h create mode 100644 NothinFancy/dep/include/freetype/config/ftconfig.h create mode 100644 NothinFancy/dep/include/freetype/config/ftheader.h create mode 100644 NothinFancy/dep/include/freetype/config/ftmodule.h create mode 100644 NothinFancy/dep/include/freetype/config/ftoption.h create mode 100644 NothinFancy/dep/include/freetype/config/ftstdlib.h create mode 100644 NothinFancy/dep/include/freetype/config/integer-types.h create mode 100644 NothinFancy/dep/include/freetype/config/mac-support.h create mode 100644 NothinFancy/dep/include/freetype/config/public-macros.h create mode 100644 NothinFancy/dep/include/freetype/freetype.h create mode 100644 NothinFancy/dep/include/freetype/ftadvanc.h create mode 100644 NothinFancy/dep/include/freetype/ftbbox.h create mode 100644 NothinFancy/dep/include/freetype/ftbdf.h create mode 100644 NothinFancy/dep/include/freetype/ftbitmap.h create mode 100644 NothinFancy/dep/include/freetype/ftbzip2.h create mode 100644 NothinFancy/dep/include/freetype/ftcache.h create mode 100644 NothinFancy/dep/include/freetype/ftchapters.h create mode 100644 NothinFancy/dep/include/freetype/ftcid.h create mode 100644 NothinFancy/dep/include/freetype/ftcolor.h create mode 100644 NothinFancy/dep/include/freetype/ftdriver.h create mode 100644 NothinFancy/dep/include/freetype/fterrdef.h create mode 100644 NothinFancy/dep/include/freetype/fterrors.h create mode 100644 NothinFancy/dep/include/freetype/ftfntfmt.h create mode 100644 NothinFancy/dep/include/freetype/ftgasp.h create mode 100644 NothinFancy/dep/include/freetype/ftglyph.h create mode 100644 NothinFancy/dep/include/freetype/ftgxval.h create mode 100644 NothinFancy/dep/include/freetype/ftgzip.h create mode 100644 NothinFancy/dep/include/freetype/ftimage.h create mode 100644 NothinFancy/dep/include/freetype/ftincrem.h create mode 100644 NothinFancy/dep/include/freetype/ftlcdfil.h create mode 100644 NothinFancy/dep/include/freetype/ftlist.h create mode 100644 NothinFancy/dep/include/freetype/ftlogging.h create mode 100644 NothinFancy/dep/include/freetype/ftlzw.h create mode 100644 NothinFancy/dep/include/freetype/ftmac.h create mode 100644 NothinFancy/dep/include/freetype/ftmm.h create mode 100644 NothinFancy/dep/include/freetype/ftmodapi.h create mode 100644 NothinFancy/dep/include/freetype/ftmoderr.h create mode 100644 NothinFancy/dep/include/freetype/ftotval.h create mode 100644 NothinFancy/dep/include/freetype/ftoutln.h create mode 100644 NothinFancy/dep/include/freetype/ftparams.h create mode 100644 NothinFancy/dep/include/freetype/ftpfr.h create mode 100644 NothinFancy/dep/include/freetype/ftrender.h create mode 100644 NothinFancy/dep/include/freetype/ftsizes.h create mode 100644 NothinFancy/dep/include/freetype/ftsnames.h create mode 100644 NothinFancy/dep/include/freetype/ftstroke.h create mode 100644 NothinFancy/dep/include/freetype/ftsynth.h create mode 100644 NothinFancy/dep/include/freetype/ftsystem.h create mode 100644 NothinFancy/dep/include/freetype/fttrigon.h create mode 100644 NothinFancy/dep/include/freetype/fttypes.h create mode 100644 NothinFancy/dep/include/freetype/ftwinfnt.h create mode 100644 NothinFancy/dep/include/freetype/t1tables.h create mode 100644 NothinFancy/dep/include/freetype/ttnameid.h create mode 100644 NothinFancy/dep/include/freetype/tttables.h create mode 100644 NothinFancy/dep/include/freetype/tttags.h create mode 100644 NothinFancy/dep/include/ft2build.h create mode 100644 NothinFancy/dep/include/glm/CMakeLists.txt create mode 100644 NothinFancy/dep/include/glm/common.hpp create mode 100644 NothinFancy/dep/include/glm/detail/_features.hpp create mode 100644 NothinFancy/dep/include/glm/detail/_fixes.hpp create mode 100644 NothinFancy/dep/include/glm/detail/_noise.hpp create mode 100644 NothinFancy/dep/include/glm/detail/_swizzle.hpp create mode 100644 NothinFancy/dep/include/glm/detail/_swizzle_func.hpp create mode 100644 NothinFancy/dep/include/glm/detail/_vectorize.hpp create mode 100644 NothinFancy/dep/include/glm/detail/compute_common.hpp create mode 100644 NothinFancy/dep/include/glm/detail/compute_vector_relational.hpp create mode 100644 NothinFancy/dep/include/glm/detail/func_common.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_common_simd.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_exponential.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_exponential_simd.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_geometric.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_geometric_simd.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_integer.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_integer_simd.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_matrix.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_matrix_simd.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_packing.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_packing_simd.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_trigonometric.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_trigonometric_simd.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_vector_relational.inl create mode 100644 NothinFancy/dep/include/glm/detail/func_vector_relational_simd.inl create mode 100644 NothinFancy/dep/include/glm/detail/glm.cpp create mode 100644 NothinFancy/dep/include/glm/detail/qualifier.hpp create mode 100644 NothinFancy/dep/include/glm/detail/setup.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_float.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_half.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_half.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_mat2x2.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_mat2x2.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_mat2x3.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_mat2x3.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_mat2x4.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_mat2x4.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_mat3x2.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_mat3x2.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_mat3x3.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_mat3x3.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_mat3x4.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_mat3x4.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_mat4x2.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_mat4x2.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_mat4x3.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_mat4x3.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_mat4x4.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_mat4x4.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_mat4x4_simd.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_quat.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_quat.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_quat_simd.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_vec1.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_vec1.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_vec2.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_vec2.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_vec3.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_vec3.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_vec4.hpp create mode 100644 NothinFancy/dep/include/glm/detail/type_vec4.inl create mode 100644 NothinFancy/dep/include/glm/detail/type_vec4_simd.inl create mode 100644 NothinFancy/dep/include/glm/exponential.hpp create mode 100644 NothinFancy/dep/include/glm/ext.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_clip_space.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_clip_space.inl create mode 100644 NothinFancy/dep/include/glm/ext/matrix_common.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_common.inl create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double2x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double2x2_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double2x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double2x3_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double2x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double2x4_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double3x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double3x2_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double3x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double3x3_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double3x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double3x4_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double4x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double4x2_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double4x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double4x3_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double4x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_double4x4_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float2x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float2x2_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float2x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float2x3_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float2x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float2x4_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float3x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float3x2_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float3x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float3x3_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float3x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float3x4_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float4x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float4x2_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float4x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float4x3_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float4x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_float4x4_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int2x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int2x2_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int2x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int2x3_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int2x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int2x4_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int3x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int3x2_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int3x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int3x3_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int3x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int3x4_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int4x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int4x2_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int4x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int4x3_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int4x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_int4x4_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_projection.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_projection.inl create mode 100644 NothinFancy/dep/include/glm/ext/matrix_relational.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_relational.inl create mode 100644 NothinFancy/dep/include/glm/ext/matrix_transform.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_transform.inl create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint2x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint2x2_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint2x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint2x3_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint2x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint2x4_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint3x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint3x2_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint3x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint3x3_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint3x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint3x4_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint4x2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint4x2_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint4x3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint4x3_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint4x4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/matrix_uint4x4_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_common.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_common.inl create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_common_simd.inl create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_double.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_double_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_exponential.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_exponential.inl create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_float.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_float_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_geometric.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_geometric.inl create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_relational.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_relational.inl create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_transform.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_transform.inl create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_trigonometric.hpp create mode 100644 NothinFancy/dep/include/glm/ext/quaternion_trigonometric.inl create mode 100644 NothinFancy/dep/include/glm/ext/scalar_common.hpp create mode 100644 NothinFancy/dep/include/glm/ext/scalar_common.inl create mode 100644 NothinFancy/dep/include/glm/ext/scalar_constants.hpp create mode 100644 NothinFancy/dep/include/glm/ext/scalar_constants.inl create mode 100644 NothinFancy/dep/include/glm/ext/scalar_int_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/scalar_integer.hpp create mode 100644 NothinFancy/dep/include/glm/ext/scalar_integer.inl create mode 100644 NothinFancy/dep/include/glm/ext/scalar_packing.hpp create mode 100644 NothinFancy/dep/include/glm/ext/scalar_packing.inl create mode 100644 NothinFancy/dep/include/glm/ext/scalar_relational.hpp create mode 100644 NothinFancy/dep/include/glm/ext/scalar_relational.inl create mode 100644 NothinFancy/dep/include/glm/ext/scalar_uint_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/scalar_ulp.hpp create mode 100644 NothinFancy/dep/include/glm/ext/scalar_ulp.inl create mode 100644 NothinFancy/dep/include/glm/ext/vector_bool1.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_bool1_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_bool2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_bool2_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_bool3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_bool3_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_bool4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_bool4_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_common.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_common.inl create mode 100644 NothinFancy/dep/include/glm/ext/vector_double1.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_double1_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_double2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_double2_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_double3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_double3_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_double4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_double4_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_float1.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_float1_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_float2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_float2_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_float3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_float3_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_float4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_float4_precision.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_int1.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_int1_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_int2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_int2_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_int3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_int3_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_int4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_int4_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_integer.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_integer.inl create mode 100644 NothinFancy/dep/include/glm/ext/vector_packing.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_packing.inl create mode 100644 NothinFancy/dep/include/glm/ext/vector_relational.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_relational.inl create mode 100644 NothinFancy/dep/include/glm/ext/vector_uint1.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_uint1_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_uint2.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_uint2_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_uint3.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_uint3_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_uint4.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_uint4_sized.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_ulp.hpp create mode 100644 NothinFancy/dep/include/glm/ext/vector_ulp.inl create mode 100644 NothinFancy/dep/include/glm/fwd.hpp create mode 100644 NothinFancy/dep/include/glm/geometric.hpp create mode 100644 NothinFancy/dep/include/glm/glm.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/bitfield.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/bitfield.inl create mode 100644 NothinFancy/dep/include/glm/gtc/color_space.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/color_space.inl create mode 100644 NothinFancy/dep/include/glm/gtc/constants.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/constants.inl create mode 100644 NothinFancy/dep/include/glm/gtc/epsilon.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/epsilon.inl create mode 100644 NothinFancy/dep/include/glm/gtc/integer.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/integer.inl create mode 100644 NothinFancy/dep/include/glm/gtc/matrix_access.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/matrix_access.inl create mode 100644 NothinFancy/dep/include/glm/gtc/matrix_integer.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/matrix_inverse.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/matrix_inverse.inl create mode 100644 NothinFancy/dep/include/glm/gtc/matrix_transform.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/matrix_transform.inl create mode 100644 NothinFancy/dep/include/glm/gtc/noise.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/noise.inl create mode 100644 NothinFancy/dep/include/glm/gtc/packing.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/packing.inl create mode 100644 NothinFancy/dep/include/glm/gtc/quaternion.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/quaternion.inl create mode 100644 NothinFancy/dep/include/glm/gtc/quaternion_simd.inl create mode 100644 NothinFancy/dep/include/glm/gtc/random.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/random.inl create mode 100644 NothinFancy/dep/include/glm/gtc/reciprocal.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/reciprocal.inl create mode 100644 NothinFancy/dep/include/glm/gtc/round.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/round.inl create mode 100644 NothinFancy/dep/include/glm/gtc/type_aligned.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/type_precision.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/type_precision.inl create mode 100644 NothinFancy/dep/include/glm/gtc/type_ptr.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/type_ptr.inl create mode 100644 NothinFancy/dep/include/glm/gtc/ulp.hpp create mode 100644 NothinFancy/dep/include/glm/gtc/ulp.inl create mode 100644 NothinFancy/dep/include/glm/gtc/vec1.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/associated_min_max.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/associated_min_max.inl create mode 100644 NothinFancy/dep/include/glm/gtx/bit.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/bit.inl create mode 100644 NothinFancy/dep/include/glm/gtx/closest_point.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/closest_point.inl create mode 100644 NothinFancy/dep/include/glm/gtx/color_encoding.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/color_encoding.inl create mode 100644 NothinFancy/dep/include/glm/gtx/color_space.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/color_space.inl create mode 100644 NothinFancy/dep/include/glm/gtx/color_space_YCoCg.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/color_space_YCoCg.inl create mode 100644 NothinFancy/dep/include/glm/gtx/common.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/common.inl create mode 100644 NothinFancy/dep/include/glm/gtx/compatibility.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/compatibility.inl create mode 100644 NothinFancy/dep/include/glm/gtx/component_wise.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/component_wise.inl create mode 100644 NothinFancy/dep/include/glm/gtx/dual_quaternion.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/dual_quaternion.inl create mode 100644 NothinFancy/dep/include/glm/gtx/easing.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/easing.inl create mode 100644 NothinFancy/dep/include/glm/gtx/euler_angles.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/euler_angles.inl create mode 100644 NothinFancy/dep/include/glm/gtx/extend.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/extend.inl create mode 100644 NothinFancy/dep/include/glm/gtx/extended_min_max.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/extended_min_max.inl create mode 100644 NothinFancy/dep/include/glm/gtx/exterior_product.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/exterior_product.inl create mode 100644 NothinFancy/dep/include/glm/gtx/fast_exponential.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/fast_exponential.inl create mode 100644 NothinFancy/dep/include/glm/gtx/fast_square_root.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/fast_square_root.inl create mode 100644 NothinFancy/dep/include/glm/gtx/fast_trigonometry.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/fast_trigonometry.inl create mode 100644 NothinFancy/dep/include/glm/gtx/float_notmalize.inl create mode 100644 NothinFancy/dep/include/glm/gtx/functions.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/functions.inl create mode 100644 NothinFancy/dep/include/glm/gtx/gradient_paint.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/gradient_paint.inl create mode 100644 NothinFancy/dep/include/glm/gtx/handed_coordinate_space.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/handed_coordinate_space.inl create mode 100644 NothinFancy/dep/include/glm/gtx/hash.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/hash.inl create mode 100644 NothinFancy/dep/include/glm/gtx/integer.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/integer.inl create mode 100644 NothinFancy/dep/include/glm/gtx/intersect.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/intersect.inl create mode 100644 NothinFancy/dep/include/glm/gtx/io.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/io.inl create mode 100644 NothinFancy/dep/include/glm/gtx/log_base.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/log_base.inl create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_cross_product.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_cross_product.inl create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_decompose.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_decompose.inl create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_factorisation.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_factorisation.inl create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_interpolation.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_interpolation.inl create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_major_storage.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_major_storage.inl create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_operation.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_operation.inl create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_query.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_query.inl create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_transform_2d.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/matrix_transform_2d.inl create mode 100644 NothinFancy/dep/include/glm/gtx/mixed_product.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/mixed_product.inl create mode 100644 NothinFancy/dep/include/glm/gtx/norm.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/norm.inl create mode 100644 NothinFancy/dep/include/glm/gtx/normal.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/normal.inl create mode 100644 NothinFancy/dep/include/glm/gtx/normalize_dot.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/normalize_dot.inl create mode 100644 NothinFancy/dep/include/glm/gtx/number_precision.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/number_precision.inl create mode 100644 NothinFancy/dep/include/glm/gtx/optimum_pow.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/optimum_pow.inl create mode 100644 NothinFancy/dep/include/glm/gtx/orthonormalize.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/orthonormalize.inl create mode 100644 NothinFancy/dep/include/glm/gtx/perpendicular.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/perpendicular.inl create mode 100644 NothinFancy/dep/include/glm/gtx/polar_coordinates.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/polar_coordinates.inl create mode 100644 NothinFancy/dep/include/glm/gtx/projection.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/projection.inl create mode 100644 NothinFancy/dep/include/glm/gtx/quaternion.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/quaternion.inl create mode 100644 NothinFancy/dep/include/glm/gtx/range.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/raw_data.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/raw_data.inl create mode 100644 NothinFancy/dep/include/glm/gtx/rotate_normalized_axis.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/rotate_normalized_axis.inl create mode 100644 NothinFancy/dep/include/glm/gtx/rotate_vector.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/rotate_vector.inl create mode 100644 NothinFancy/dep/include/glm/gtx/scalar_multiplication.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/scalar_relational.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/scalar_relational.inl create mode 100644 NothinFancy/dep/include/glm/gtx/spline.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/spline.inl create mode 100644 NothinFancy/dep/include/glm/gtx/std_based_type.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/std_based_type.inl create mode 100644 NothinFancy/dep/include/glm/gtx/string_cast.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/string_cast.inl create mode 100644 NothinFancy/dep/include/glm/gtx/texture.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/texture.inl create mode 100644 NothinFancy/dep/include/glm/gtx/transform.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/transform.inl create mode 100644 NothinFancy/dep/include/glm/gtx/transform2.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/transform2.inl create mode 100644 NothinFancy/dep/include/glm/gtx/type_aligned.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/type_aligned.inl create mode 100644 NothinFancy/dep/include/glm/gtx/type_trait.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/type_trait.inl create mode 100644 NothinFancy/dep/include/glm/gtx/vec_swizzle.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/vector_angle.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/vector_angle.inl create mode 100644 NothinFancy/dep/include/glm/gtx/vector_query.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/vector_query.inl create mode 100644 NothinFancy/dep/include/glm/gtx/wrap.hpp create mode 100644 NothinFancy/dep/include/glm/gtx/wrap.inl create mode 100644 NothinFancy/dep/include/glm/integer.hpp create mode 100644 NothinFancy/dep/include/glm/mat2x2.hpp create mode 100644 NothinFancy/dep/include/glm/mat2x3.hpp create mode 100644 NothinFancy/dep/include/glm/mat2x4.hpp create mode 100644 NothinFancy/dep/include/glm/mat3x2.hpp create mode 100644 NothinFancy/dep/include/glm/mat3x3.hpp create mode 100644 NothinFancy/dep/include/glm/mat3x4.hpp create mode 100644 NothinFancy/dep/include/glm/mat4x2.hpp create mode 100644 NothinFancy/dep/include/glm/mat4x3.hpp create mode 100644 NothinFancy/dep/include/glm/mat4x4.hpp create mode 100644 NothinFancy/dep/include/glm/matrix.hpp create mode 100644 NothinFancy/dep/include/glm/packing.hpp create mode 100644 NothinFancy/dep/include/glm/simd/common.h create mode 100644 NothinFancy/dep/include/glm/simd/exponential.h create mode 100644 NothinFancy/dep/include/glm/simd/geometric.h create mode 100644 NothinFancy/dep/include/glm/simd/integer.h create mode 100644 NothinFancy/dep/include/glm/simd/matrix.h create mode 100644 NothinFancy/dep/include/glm/simd/neon.h create mode 100644 NothinFancy/dep/include/glm/simd/packing.h create mode 100644 NothinFancy/dep/include/glm/simd/platform.h create mode 100644 NothinFancy/dep/include/glm/simd/trigonometric.h create mode 100644 NothinFancy/dep/include/glm/simd/vector_relational.h create mode 100644 NothinFancy/dep/include/glm/trigonometric.hpp create mode 100644 NothinFancy/dep/include/glm/vec2.hpp create mode 100644 NothinFancy/dep/include/glm/vec3.hpp create mode 100644 NothinFancy/dep/include/glm/vec4.hpp create mode 100644 NothinFancy/dep/include/glm/vector_relational.hpp create mode 100644 NothinFancy/dep/include/stb_image.h create mode 100644 NothinFancy/dep/lib/freetype.lib create mode 100644 NothinFancy/dep/lib/glew32s.lib diff --git a/.gitignore b/.gitignore index 3eebb35..503012e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ .vs/ bin/ int/ -dep/ *.aps *.res \ No newline at end of file diff --git a/DevScreenshots/13. Faster Renderer.png b/DevScreenshots/13. Faster Renderer.png new file mode 100644 index 0000000000000000000000000000000000000000..d44acf8719b4d5942f21c831a53d9f6dd5df43bd GIT binary patch literal 694019 zcmbTcS6ov|_dkq+6h)$P1gTL`P(ct>I*EvgNK;W!T9l4-DG3k=h#Hk9MGz?g=^`M# zCm_A|UJ^_S<={9<AA#fb$C1C{Y39BM^T^n>S2e=QQJtHgQFz+1mpFw!#u(S2=X+MQoZ!j%-+&2S+_q4n*2V>@yi4Cq{y!u8F_wKEmU*UNs zE2{lf)mcpUuTk^k(TmTNcqv(Hp`#BIzN+fHsyMr;4fuUVijw7gw)6P6M}S{BS03K| zaqE_H(@2P$pS4SnH@kO|y^V-m_n+Ht#@W9xJ}Eh_v8~ottuoF+Z}m=S?gtZ17`XOs zKA9BHzyG%(_TTc6A__xT3ts;J^7wzBFv_?gfvk#d<|5<0pt0)w|81y_=lUWW|Kphv z$I5-&|7HCDC`*TUOA-Gsz5nqD7Hq6J4g2>gVfb+4^{1)X9y9AZaf$o#m_?5s+P||% zA&Q9w8;ONtclNg-tZBrKe?Nw_542?A+3j&@sDFdxa12v2KVE*CO73mwZreskFp5BdWHtnj+%)fhb3Zt|M?HNi@Dfi2(oD+ zcn?8eWH&nC+>c%}U76;?8*Gdm@6F3xu#R*n^!8=JR=^0+`j# zn!_tFS&R57EYlPfIJyU5i$SfMm?|vda-VDi=3wtjky!+Sy3fvbnUzIDGPVjgP7rI% zf)UrQV>qw}#a66CfXR3)OHZ?vYSQO{Gh1BzSEWF_ncs526|YF2rzWTz1qS^yftXz_431_dp9ucB(a$F10gMa`lvb7qR`T^`a<*1^=5CoVTJWSm_C_($s&N2) z(6x=iShA?a<*%s*2s{ZTo?8`JKMmz(chZ&&)#}F%R(%qCwal z$=wD1fmE~5IxO#u*&76jB!ytTrQHOx91s72{bAfy>%t4+60KR{F9s>B^(qdS6KqB}6 z8x&}1CC}agv*$^@!oUC)inSM=$R0&(&*E1k50@OvcG*?{BD6p!31?rL@Q%#~WAQS< zs~v2acZX}&x2hDIcDf)5C!QOto0oq>~3wdP}$fCFk6 z85-D@gDHS@@GD5`=05GmLG+PBw8Ah4u!cS0UMj|�-VtZ_l9W8J!qd4TBKP(m_w} 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

Rbl{ae!mN(H_v-|IoTf6m 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

pRJ!>3uc0^l)+Hv}ylG68DUoP3+Xzw6 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%0D%psdKw618;Bo*Gzc@%z1GH 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 z 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 $#WhhGkRLS&TTD? z6tg4PJXy(-HjFWQ$P2NcT>Xz#^d^>EH%qw^y~JwNSXpB*Wv8-eMrNh5Dn=AA+tGQO z^lMx#F!9!fJ*pM6>l;^$R>2rg%T20C{;0OG(NZVzWy;Jq%}jsz6<+W2tUb|&(pl4v zC05_Ys%h}MNaFnK3(P5TPWr*H6QvxL892BjP=sMTH0xcp)|kvThDe>X)%im6t&n-r z>3M1Bee%wtrNXw|76k|L z3c1=F52t03K+y8ynLYe?!ZXowr4LzM_@El}bU=G=C)X3G)0vl`jLDG5G5AaT=2P+q z%Q=k>mqt2d*XLxFY?H}{%Ln}8>E;?(i~?pxw-98+%(m4E3X8ohSjv_w6;Hqtey-_i zUPVq}dOl-cH>GAVMO(_RWU1`0Z1y9UisLe7PxPkY=^#7qmx|F2W}KF3R189i*telL z6!V-f27i9*wmB)*u%AEF7N4?u*NQ#T6(^$-#%kvo9QnBOEjosk+G_U?Ewo2pUTy9> zBd;LzwnzIP;q&Q|sBz`p#;k}$OvqWC*g;SOhCp#qZR}o?#8-{aLTUc3Mo9{F-Yuy! z%+=tLbP9{aXKw)>XhH<$7-#%fe^v|I8Sn0<``hf>&wf|uF1D%k6MLw9i5}e2zrAs) z&|(n_*F|$iwg+iV=dLte;?p@4_ujw9j2Z8M*U1XJw$hX}q4<_0lp`z)2s5`kJsYb# z4HArlu!l^JVuQ@$N+Hp_s26P06$klmou@O33V>wijsq7?I!UxtDF^2 zk+-7x7ODaypVesy|LR*uGg%>rt1W3f9(o+wz?CC|2{M#BebIg(bSp|tn>r$Mv*SYt zd22f*zpIwjMEwMLnGLvs_HwRIV@mg@*4{!WAQM`wsa2i$&LbieZ6x!JMOuoqy!Zu~ z-tX8)>d2lzTL+U`zgsmg;7vae`)pcoh(8sN#Erf#9;ROBb3fD45;q_77p@`CxemIW3NYIGjiy-`y>>{pWQ($J;9x0Mq;e6;d$H)%^bATi zpiI-6=N~($Bs!xQjZb0;-uGoORqWl-yW}Qu#g|UPG~f^W)2JHX9{pSHP1%gA_fF-2 zd7+;WTU-1s>i*hL)%w$$4(&K4Rz)_q3S#bgAC%6>2wTYqv)A8ltJr7La}KnhTt&W) zK$SsgSMCBp<3ZLrPGAHv&%eE;|Lp(4AUc6NvE6$~3}_h?91 z(Dv(}*amUTkM@nZXWs_mnH*BZex=BvS6hk`+~NL?%K^Soi6-3=48k5?aKrPW&?LVX z^>b9o^1UpUo+~6VC=iA{)CaRh{7FqYBp)=YH}~e?P~AYLM6@>B7F#%y?Grr>oD!WM z9m)_|0JcBpzwnx6L(m4<&rs?BH7iTbjEPRt>CzH&tLI^7B8&)VMu z{fd1ZE-Tz}W@HgGpgDB1I7Z-UzB7C&NlLeI{NpLM4NU-PM2Se~QVF3p>SB?QaC1Jz z=c8A}^-gV`bY=3BOZdm`S&KA({A+JkWphq`;XZ{m^f^3H%`@zv;iN_2R|HsCgj=TY zI_gm)_M8wWnKziLN&G-I>X@^=IOsj*{}8vn<%5pp(yj2%iQ4P*;4mEY60P zd+Wi0dL0V0Yt5dmitYG@C|lhvKkYUQut?(n=Xh6Nu1;AS0l36h`ac(UQk$_EW3MbO z8iAJO#PFt65b^xT6|2LMJ5(&gd5h4tH+P}1@A(AChrxycq_Zb2-%%M&-3`ThW< zYd*k~wCIUB%ND(<_{Ff$FY#*%uQg^EsH-l-ctY_D+VK_~!066d0|UIwubn+j`^sDZ z{~SWLc3uL2bZ1NIuEB zRMSsV_IXy%eg`Ny(*;LsGBSumwP1=-Ga({d+bN$Q^hQ}G@E=P0YZR20wqCw>=7PUgbr~(`M3a1O7f&w<4DGux-3`{C z5%wh5FU;zbl+mF0u5$Llq8nO3U#y{DbMtOK87WUpd0I_HQ>M@~uWdt)iFnWaZgV%% zCHMK#mwLK8pw}1q$-Gn}?&U(i*|><7LdfR^B?c1DQ>k}x{jvpGDGt7O^h%M16CzlE z4^Ks)hy#-;z;<(-K-UV>7xxR>W`Sn8Jmg8tmVKEe(l}4wW&jZhqtVQ-l>QxbUKs9v>BYhFiA7;Ht~w?^63=uz#Ye2b z4^=~VyM>2Pe*4a>&O5OEey@&`d#dR-&`o~G4L3q}7HMu^+4NF*k%|;KQkH6SfWU(N zb7iQ-y^igM(%zfPy~$X6#)C^*@GNcLy_qNIQ#9JEQ>NO9(6WgV9;x|6N+TEW$bNzh zMKZfsKRB8D&|Sre+^%`Tir#_KWE|Vn+LE<@-kEG~I*8=K6 z<=hRPKFzC?gW7TH-I+h%(am<_nB$$3nWH>ePT`HZnE}@_cH|c=JUi|iWfKX*7jOL} zu{IyIB+8w3mA^;ya&Mu|Q+`ck-Y_(1#W}Kqr@yMxlmi<%aYWQE5M6ZF0UVa<-bT8xO#us z-#>l(A9TpbFfTusO}rHqypL1fd5#7pi2z` z6zeSkVkgh1Wso97DOcj2ZzBOtv|~K>%v;@C%{PREGwQ61It&|S!m6t|8nukpcH!+M zs^d*9OtY!oai(SKV*L_&{Yz|4#<;R z_KhmK{c|68HUQj$ms;a4%4kO})@6Us<8!xM=#Wx-3@MwiM=$+%w*0%dx(jG%x>MqF zjTR_4Lb)E+CoW3-fuB)w^r*w3WM$FOR^$)Q3SL~8=I!vI5vZ?}Mo-mAkCwbK8uN4s zQmMPrX=mq%Sdq@)({F|>Nv9YOCd6booawCCSLXKJ+3}@WHaL-IH=J6X!3tI(1cq*L zw3U7xrH1OEcE-(%w2Dj>+TN>4gaXmmK1>Fcx7u>_Wq;t&l8%#r1f?#m7jXodv7GJk z*qV1$Bu6*2Xdm#HX(*$1r&+J4fgAxzgf*p;m3$ho@x1@MOwdze$9cv#mOu1i#jet< zOfn_xQ0LD{618E`aHC$oTk{Mn$7iheT)K0M#`JJ7bv$qn>;(WF^kP0}qW?(^9-i=iy50Do5+(?@4%^#E5Y?|k8;ibQ}$M>YnOwF>7x z2vj}Gx(TA-3&@ZYn(X)w?7uhb_hkgk86PUxoZ5dnU!ZGZ+#zo=p(K)d%kO!#9~oc*!l8bnwWz*ae_i$XWs{Uv-UrXS3zw*F_*)`x}5`*Oc+Tu*s{Fm*l#6* z<(XLV8PC(|bbSZR)b+9NHf&wXeI_D;`o2M<4oVk3935{=JI6e(E(HBRHT$xdzy--n ziA6Ju3)ZbEGn`SouPG-HBcC5pmA*2uS(@MQML9j3zXY^8uH->e39r41G-;C4{+a>a z(}_Z)tUF({2OV;CI2%P@d#Z z2DqA#DN1V5td!0zp$sV_h%k==sSp_dEav14VvmKej7=wIpIx)nD6C8?-TI)^K9 zayXE+hRCe%G{nQQI?fbUCzOQ95)(_CX-@xsFYX~4V+h3O_w5{)kMJ35K2^N?{zw`0 zhq!2aR`>)CDsy zNy?4u#}@^Gt@r;FE@EY$3&++ON=TE_U2tzClB#RuUBxM{x(nX~(^wSzfl25Lw*A1g z%XR46G7f!AwK*ZwRgPvdyE(Jae5gp~qV@OEpFzUwST|dxXB7&B6O3+VTGYCIDovED zR(XqqTZIHCFTQK(>eDfsH7S0C%*<{~s)$X~FCL3R6>ddd;F?gIF1K_x5~mCvwMDnG zYFD6}T%5`jT$fh1$Gw|jz+Bl?1l5H6KB0Y%8)d_sm;{H{+>R;c!&4EwKg=?7+^jI1 zN6bbin+O42DnPq`jiW%(s1Xd~YG-MET5Dv)>dCL5L}3k7;yoBW4j4U1-Rx}^+kOo^ zn|D&boOL-nD=YJlh7U}cE zfS#>6u}_RsZl2ugYK6A7x0bkDWImpbsh}RVgA`}0Mk-{`ouf|o2rbV}?_yo4jrlI* zYYY4+1S_rDb49qfBzyr2x_b)(FNKeO;!B5OfYJ>vvHsx?*Rd3j-9J?O&wE<+XRzYde^k)oz5Mi?vm@wE zkHOl_Dmwh;*^Pq9;lb2kO+bC2+P>VY3##dbGe-`3^d$7sR5;26Y9{qq-q5h|;zrCz zWk)w}-pb}BO$_kx#i+`>cAH>@i3uBhsGxB)0Bds}nHW$4SG7l@&+k^T-ya!aX>q8C zRIbVyHTeC>nBWrOVC#soq&&)#Xp97edye*Siy*xifkH%umwg#q2?zp4^BwME?@hY>QL~S+XWhsCDkN_b zPe1+sJ;RV3K2WthHLOdRkwgl~VJeTeWt1$zlQl(NAd$`XCs60;h_*I;{lzNS4^v{d za+&OkD!E0D!i{r~wzC5-N2H?$N3z-g_P2H|g-j|)pvhCcF(IRi?SZ)Omt;JFNljaV zNb8&XqPK^F9p1AEgl3ad*|HFFEjBvVvJqwFcd7k*n0PI81BGhMI0bIxzWJxuhIARK zo0yZ(pFIEhg)PUJn}P6fpSyIoZ|?+L?3)+Y05r$mh?Os>b1DKy#k% z+9J%Dqqptt4Ac*ty&{Mtl4IJ;7fncIe@ER6yWRMzZ#`d=6)uaGas4YLCvtrjnOYEq zdGy|z;2i~iDX+I5^87TM%8dSQ#9eC-w9T{Uw%Hadt|qRD`lT~y>E`0+r`gR&k}=B} z%NJ9HQ>cFX`j&}vUG|gMkdQ5NE&sFGCJyQwG%I>k$!vR$9M!A-Da#dF5lP^%F* zhDBaZ$!66zuc?>Jklogr$C`D15T7%}I_sGc_kYfy?7H+%r`bTVhz zJhu(Z@V(gXjb#kg#ApiscBP9>JGyHfw3#Vmj8-BEGjRe{g+za zEYo3y{aC|nO%7;G3|>Dza+D?F{V4yNc;{SRUB0+Vqbhehg)Spv;5@QWnqZSLy?vo5 zX(t-wth?^i+Bh{fi@JfaeSH`92tRJaz_gBOChrW22*W7fV^r7lX%i{`Q24J=ZSQFq z%a6P2zt7R zc=MRqi3S-1-Fe+w9)mr5e4KqPBT5uR<^GQRQ~?8-E61A1Gj zxKsUL3n_kNjnrvr%y+gMeD}uEQ*LX5EEc9aNMpNMAdoJPhy2uY_}WY_(8tfqC&Z1T zc&2|EQKJ~#peR^?{~Pp~1l1~BX*Gqe zT6t<7@q`9iKrM5h_MFO!Cy*z3Qbc#ie+dPO6ZZf70*C+|)NP!$9Dmrd9#^^wlz@8q z1XO38z!_WipL53RNLDfg91mR16h={!;6!^jx7SzEw3S`HQ+|wJC0E+$v5-8o5!}V= zOXzE5puXLQw}jCwD6{n`l*y6w?{b>+hPuVTBE-tb;p^D@AJxhYh;?dttYjLNVdOz~ zLw%{Z9MI!KZ>!a4BZU}T-=VW?M)W9-Sm#L&V@PbPk709W%n~rr>{?pz4R*p(+18nS z59$X!#PPgW#4&4vSx!0jQ(P}~QrW4Wic{~Tw>eIBm!9FLlAv-|uLC z4iNfXc{`&}#Kk|U5hLsL29{dS&MA8y?aqX%zCi_6AAH@lZx)S7C!=tRi1^{62L6l35=jxVr$NbBu`eYA`z5N&bOGXGq1RNv6-qYi(xu~nMS-TZfL zQTIE=to23Z2Jrt7JSX7#$BEG&C-y;r4bd$)+5veszvB2(5y*xE>2x7mUCeEW52Y;? zI=hWk^IAv;t6h7G9ltR$-BNP4R{+X+s0qCm@^oJ=^fwSmd=x@q0|qcOO2uZNubNpp zCG)f8_7Wo0+JV#IzQRKRAp2AATL!(83rzbu_md1@+n3_UfINNn$R%)qmrto(j)@)F zQ_xU`=ag!{V1M3FHe|QEb#$h9tLRUC3wX-emXjJ5zcmb$$6B*HATxe1y0%TU?wL|l zYMx+YI(!ini1vw#QHp%=yukpYL5VX{)APRh*kjrnxp*@~pX$@F+_1jjdOXNG8f*cD z;NPV=>ZLjSOFO*puEM@QenLFy@4OZxBKi^1t!9sU7ahF|8dcGhfKW^dkP4(o$eF1t zA|h}gKKp4!8`JU?r35S1f*_2iaoPVe{{9fDtlI<~R}P?2l88h4G_2M`@e5=++OaU$~7h)%*bDDKbt!Q~2ufHy^jDPl;*fx2J2&*GxgL#x7ti{ZP{>ma?)X`do% zKXS6|+dQ{6Fr`;kkUZFGgu>6C>fb|*cZhY1?{_S|&>WI7M66HH`^)Z|%*tkeGZEi0 z>Gp9DsO(a)3ejMHJq4QW(Zr(cX$)pGYwG<z@V(Xol<(+j}2>%T_k2Z$1iREC^OltrPUrr{~VcMI@J=gwXJx+ z|7Z^?<@iWbv~JW)$)X^=5q*nfPFGGWjOr++-}PtSO#D!9CKb2LL52rV&2h2$KPL&p zx}m0&=s~8nyN8C~7gk5sO)NG5+WBtd)kw6t>;kGGOsFWI6)qZkb>aAJMt_3 ztxVHGK_5Q7i#RPL@}<5Qr>GP(HU1GoHG6w@ctuluK@XT4Vh2ul({w+Mdr`9vQL z<800kxBrkCxkQ-n@0rk&ccNmJKKa%KK7<(E$LM|}kf#5Un>CtEtHAZ$iyqJPS=NM{ zoi|?O_~TcJ*um}bRlJcd{~uJgUwZ^7aAB-zCgnoK7p^g9b8O{8EJ%%m$$#MN@Lh3g z0s*xWTl4=&bt%-GmV<2%Z7ntuV9=jWIx<8$4SPHLuX+ok+I_C7!Yz)aJ5dv$il|7Dkz0B z$f1{e@&q$H&KigPW>E;X_LPJPX>s$Nm=Isfi?nLjUzda&2|9buUF)!OXMED~ONxDfH2*3mh zeoTIOpT<`;(pulaS#D2T^E=KK65xQ4?Imk@zp+8~a6Tg~?RD+&$rm*Tt12>^% z=V=$vaq}#IBz>wg(}O%`z2NMwKE*~X*dU?nsd8o~OSenSM0t5`q|Lqsl33oAqvMm+jE^~ zH4?I#cGMHLI9u4>vUes=-+1w|kIjz6iyg3J>aQFC?CLET5~vYF&h38A<^pi>Ov9Vt z#ht}tL%Rk9(NIgIO_0JYX3Ez7zh$kjni@xnQH0KH>fP|)i zvu!eufi2O^0V3twvwqp~x(O)Mi;lciUG<{{u0Z5|NR)jNXt|Jv4R9=?8W+FVFx%8E zbrvRP?1Mmd_5Zv&&2r|#$NI?VEeflI=OP*!%1Vu@UPr)GVUHgI=1y@4&M zfC~<}iMsF^)^k1Edik_r--&!Q%QgVeX8!6h_u}>bS}#<(;1vx4T?i>f6f2@Az2NPj$)s*mV-mk@-0ppr4B291(N5k4e)8Le zEnSrt0{}1**Y*HZ@~*$vN@|-JGxmKSV@vR`0k3{C1-{$@+babeFqj|f5 zVC+KZ=UJ_$fJZxV_dd0KQwnP@IAbD@9h~u!^U}8T`c%1aPz>y~{n|RRx(EX^_+eTx z8G^QJ5`SYa2|{_5e$_BV4}Zg_oDRF11-6+btgw4#8L+PijTf;HS@zY?RnP#5N+>DMYEhTdVao8v%xWVaVD<_A@1DpRC0 z(#A&-ZluTr$=D+6RS4Ye(R3As-NMa2^ftR=@O|9r7U?AyneaLTSbw?$QbA?7$Z_)0 zyo`2^V#UIQ;sCGJmElOjLzC6XK|*3}Ly?X+kxg{F9OpN3Qgawc0Z{Y^!Yov{AXwv# zKS~J{(YwKC%8F3iv<71gZUSUS#Wc%x%O@Nir7*j>UdO!kj_@m} zHwS#kkd1MQE%q%z_%roa2K&(rM$7{!uK*xg2%nq|?@Lm+Bh9!)8dgZS;@ENiP1#a%ETO`}uc(~NzVyHFPO8Kat6blYtHHZE zI$2rMn*;XBZ<~Jl+}x|3o#qU3|JCwIdW9PPkI!n|YnptpEt7o)qs$<6R3*0JU8cNg zG_JKVIlI8Ov{Yu&eDz9%rp=qx+X5q)eEqZe?!Sg(B@{NDnk4&gX4LsSJ>c(>y@(@Q zRg&L}*c-Jpe#ZUAx>bB_lD~tMO6j^omhctMZ^Qn6 zrzfO~!)lmiXY|9HchU0dkgnq|4keF=MM-cA8wZhin<#vE@#^Zxp8oYgPr=fv-mEc= zck201hdL2GmELM;;}OZi_l14wu=SwyDN=Xazkxjo8s(vp0wyF7x|;_em=ekI#yCTZC< zRR-Q%2mI)IXt8u0b~(TM_I_X!7#vmTM})=B@N+3*t}@b)03Gz?hVc#&Mip}MJSq9el8V>tM(vybd9RPA_lGhct!EmJ1wW|Xu!$kl1@+p+FS<5W}rXzJ)bxRdvWi+T;@JCYBS$b`rK0K$=~rXu)?#w$m?oDh)L zXu5dS>glPT)w;9TafiqA5nRjMZO@9(X+fjDj-7fW*2ufw5f|uLXYNHKu+u##Uv-sE0i!Fut@r!%MZ?TCBTKTzf-F=bTDGSL ztA{n&!zBQTPHtD^F6Q;Y??uj0L_rrHx=(v~t3gZ(i`mg%pw`7=V?NE<9ceuHYN-Zs zb|8eWB#@b65IV~Wbx%jYGcDI3x||Lem(RO4PVH~QjxiGLcjk6m4_t#3xNti%?H%!B z2F%hQ+RMcL*jZm*G+Se=d=Y>)Okx*`VkAmeodT3reciuwaj-6v^gH{kLq0GS+OZ*k zf;GCbpJbXF1ypb4cMyFLY_noG?_doI2oc|@B zpyGdKrYU`JXe+;cruZ+hVkk^h&<21Sr^at>K8HL$vt=xCcC0FWhGxb8vBL(H(T6Y8 z{E=)ZKn9*L{}T`7$|XJ?&G!(=fTY_so$P@-``OZ1r}1}g*@s7q!WAZNnL~yN1opnH zoiWc};ALDq4u?9&WTw!#m}7Xo2#>sG9XgA%?hY8Yu))>kMNs;31u-1rn` zOlXM2L?5POO81-dCdgWBZX&d6NY4?k?JQo)Va|JQ541SDIu*E8Y$xoM?oC6bteR>& z3!_xMisy2Wm-U&x)&eCpdb0B5K4T3afrmQz+&_t}k87GFlovU+=BD2mbdDyUQu?J? z^I-JL#r^;L^Z(0HHNV;=&6i+u5^4jC(q7~%$9^)3A*JvMLDI6=2hEZ%WXFAaTahuU zRay>{()dhmN+lrwT#gag5MplZOyd-Nu*dWjtc1KvSCpf=-&DteR;8tAZ-$<|&W|!9 z*6o(oe>+zOAKjY6o|q_#%Og5q++(emV6bhs?y2d#*tC}XJyz)wMc2_%N0lcogekGU zl}PI8rVBFRZI6#GEm(U0GO5IW^Dk zYu)vZSJl_F_EUPwL{Wy<$oi}9mO6*Xh!Ur2PyIZXeb4{tCmbJzlkB0|&-LI}XjSlK zXdrSj9TSQJSEh;mTJ;L^)TA@=Yb{v&uv%9K5L{TTFNTp-9MY6bt7Du^cX=)usSFTy zh$QT~=DjGtsLvBwU|FIv>bq7Q_}!qXRv^5+^U|(^UAsUi)$E?@cXwLwxDl2O%b_^y zr~Tz0tu0d7@o`*HB+1M^EB!tB)7ix&RNK}BHX|=vKih+K>4zpUW?0KqnI)f6@T$fE z;|W=eY_<(`uLot#LN0jXRDYY^9>8qz+X>LW;vIWI4?bu1`)a1}w)$Of6^DA1B&F~D z*)`R^ELKh0%Uk07vrHQe|M#jPOeEP#LlQBQ|LyN!nDrM4Wz46tc3E)@GEd!ODFTd; zAdTp_CrPYF0tBphyilQ#8M967#BDM~C!YD7`L>e%UhCL>+qZkD%6GLMCOUT^t)ip`p|T#>7xC)9p*|_OClIUKTXVx13U#-W?wZ zsc^!}LOsHLHFebIRcvH0uP%H_y3A$-BL4MVg*hYmVQ23{%TgBU1^Yi~uw?$B+BJAO z@OWLM?pJHf7j-!)KNogejOzH_Dpg?_Cphl^rhfbqd&A}X>A!1sF8@iB>=BPknb&pM z+0zA4r_CLi-Ak_@WaRkB6KkCn$f(nZ*)p+9h>l8pSSmRw6WBJ!KxCzY4^Fpk!}{NU zk-X>gRVAziQfm@p8%PY$}C?NaJG0dR_uy& zq&?PoOV7PK)Zn^#69-u1xin-Ofey|L*S4T-Eqn*7e-NE)s|CowJMW*yes>gW!d<=R z|18O4-P56$e_Tw+V-&i3^a?6%PxAUMy&oPMz-Ug2PcP@P#lA^ za7C+9`>6%$-fkV6VZWy867UE&8dH3SPQ@pgO>P!dhN!}6BRkpC}Zle3p4 zLs_m#OPhgRn^X7jv~d}m@{y?bvJ}99i;~CVL4xXN;HK3$enpLNsVrTF-_jK2Jnv}{ zQ=kM!NJ#BGhJj1D-%QbK(+^nk#t`Zhuku2zpGyaqU6Pa{Vsk@zt4tI27X|$3a%2{l zRnYBIYu(%Nz*3=&uLA7DEE~8PcVW!DXsfBG2@Z>8Ur&NOO)Tjbg^J7b2tm*lA#ipi0-}98IcSz}x!Lxx15t*5|%D2|S{?6&gg> zoA&TU;wCPbn^WW68Tnggn}RZZs0Nv|aF6V6t=o;{q)vXmmy_^I?RZd`k+ZKnfa>)>weqWX)h^6I%IXyq zBFZc^@hbcAUv-II0e)mt$(3Xen!`Z^lFeGPa%`*UZzo;sm9Nt{Y@#>ae8Rd|leHvu z_YzCIHaNdy@Vk|{T0fB{^UstnRooid@%};$=E>LvT5mK790(-g+Fxd)CBsi{oS_e)3aVjm{d(>7mS}PTne)(e zXoZ4ELfe2b)0)4fC|mi+=h*Ilpv-3V>-!s=1jYA2WgomMIrv?2X_vm}#ALKg-V8S%y8@`==so8)J4PO9jFXT9>9(u#IMOqZt&T zQubqK(V$E-y0|D16+t><#cS|ZWC0=f+>Ya4#$W$B{VBm;WA^=^zVGKzeW@xV2v%^E z{liL-fnX)yH~~tJ6CTlm_-cesf2!B`!T&^-nST==3Y)Zic4}~RfBYk_C-(evA%>TGt$@=4#nbn=()?)W?lpmYb zjpC;DOS_ER2NAJRw+lz!;&$fUnD4HJhQIlAUXmrt`$rtx=<@t{?-w-Y6$i^@@+7@k zeLQ}Yys3ONdJ^1XreBM^AN5C8=3!}}p9^m(t?$E_T3PVVg?%)QMG=0-R*_#LjJ@ihcMwDE5L#|1sS1n)}-Dkn6_K?djgC>hzVY zWBlO@ycpaDw=A~Q{B`>oyOWac&4KTrBc5B%3aCJx!R^ph-tq6`%~r>hiyx7FS1s54 zqxnrh4QFb2TXWy-6j0^8(%J=q+Yfxiz{uVG38(=D;;hYaC^dCJzOl45^Z1hFxZ%{F z^0-nR+%@8|uRlW*G%5`Bu$V~FtH+15S=>X%d2AvTB0*h%-U8HN=$hJIrqX)tx=UdQ zTVJ^TUwK*wwl!1B9&J1en4)M_+phIO1Ok;ZQVd2SV+;tplv)lmJ;3Q0K}gLk}JF6%&d?o6uys7}|xL_2V*L}G8MjSR6Kw;UebG>gXl$7iG^fxeaqZJZIeB@u?I*j8DH&VC(NqvsDD(!EW?S&~TQZlybpe5oebUMzkamoy zXC{LE+Kf5a`1f(uSZ<2{58sIy@*^9!wEt3*$D2%LZ4PaUIUs2=!3D8mepy>tDYSn#8WY36^9lRDPR2#h?$R9p7%OT=FzZKl z`wAyT%@4@Tg0C$~l1$H5di+@Z?8~uiJ^v>l#V(^>60XREEMXUEX;foix)XRVR7aY| z>&#j>Ff#M|{^ZI}Wd;}LLSPo|OnNc9D0#DHD1r7e1846z04)7>Ys)LtY2#Jj;oTK? zJDKp*ux41sihToooO8D7rr?-);ku zOxN7x+bHL-2ew;Co|eLOa={}>u@47)NDGojx%c?mj8+MozDDh|2l=;d2tK49>OP|| zK^s+-*#^_+1bcfgo*g987V*4;g%2WX8N-Ys;=i+EcZfLjCziL?S(^lVvCZ+(ig~g> zC@XlutD`W{>)Z24N?8rZeo>*@d%5feQ?0ZxJ#~veaoqgpEci)?BzuW{63e_}Q9Y#b zQyvkTOx;oIM?J~$aEuSZ@`(f+jN~s6IK5YrV~xQ-dB#3bI7^rE`*blx`Mez?9Ah*AKx#kys-}#s9SK=>um|MJsX?quafqX zNysrR;uzVPbA`w4sjQ+kRRDagm-2G@<>!!J2E`HiQk9Bp82h2bv0jm%4?g-(ru~*w zAt$t|R4YiGvHT{ADoIkwgfNImU_O#9DqpJ|DPmmNMn){($YSn5cIoHzqTbbG{18?2 z_Ck-L>OVBt7Cd(#L#_Tq-rLJ)Jyd2mQ=(qX^i^iLBd) zoY9&Kf+Yu=MM+@J`u$Wmj#Q4%pFdYVxT4=2hxTK==*#=>y`vG9Iez(cT)sTI(t2sp zMR_5;tzudgI>UBD_OZ5{HiwczztS&bDVtCwCzbYGAG!ABFgIwGOl2e$p8OUiF}76l z@MtxoIp@L)h;>9J7|R*f&tuH1Vmc;m%+)85iw4$B{=;Gn8Az}1%F)@mtQE451<3mO zCE7qMNd^{*%DvqiznJM<1~M9u&p-JbYeP^iCd1j11hMW_t5w;@H;J-SX|%btLQX0B zwCr4{|350}%4cVi!Ft>PJsxFlU_Ry{OBg0qCi3Wiqc?#pM`eJ%TwooiY)T*`Jbul8 zO0+SC2au&nyD32wqyjY<2kk4gF&oFXbs0P4|4RhwC(w2Mo_GCU8fhUoA ztB-!;Fou+GUtZSa$^9+JKt-*wxxTT#{_Jo36^y`Yz&Y}!@O8=( zUZ*^9-QR9^mG>%R!z%T=G~D0Q1ecCiy>8kvoV#EZIs}*2GCUjDHsaWLCha!x>Jx$& zujcNi+wbOiSwGu6nKZk+0jB-e8~^q19}Q-LxeOQrF0k@d@tJSq+l;&T=AD~MgKsV` z+Ds!oFZwpV{p{lMP9Tnb5o}y@5o~(Pa1GeF1Q(C*E{;vpzKG8}`!aYoO#>#M;NtL| zVB_%F?t4?Osmol1yXxfK3&-RW`0Unamp9j4bliMHXBiDX6ATSEpO;BDmtEFeHjZ7E zmz`(wy~+~IB4Nt%*)4155lmUT952GMvb^j(Qa@!dOqwZA{+ahC^z1a2A&?%y zrf2X8EA(u+x^6F?TQi?YrG(1NQrEd4yHUx;O-{ zGy}`Z+3&aI*|19bZO`Vi->xj?H#at}0iu zlaER&?w6Anr;>_A<+Rq36gJ1$mkD<1*mN?|r%!%*T$lGAZmA_kHkVW%Ta2`sPGPf5 z<;3+|kL;$fS=z*=WY+J>m)P9z-Mc5}mu1=8T*F2*t(GZ_>=?&}lA8zm{|ZJEvbnP% zYX=YH{PaW}ywd^ta3<=PE#kXYWd}EDqwAZfnEe4ZpZ=(fu}x24gP%`Cu%W6-r$17~ zBRBq3`sGqdPFUGkE6K&tspLY~%rtI}=K8T|N`%9z&}#Onyco*vW>#Xch-|H8Wq}P* zrP`5P6!RUM86Vn6zh~TRMPw$EeqUamU&%X9-j+tQrAoORHg8ngFw(19wRC!FRYwc3 za5^gw-~T{rmuDJ*mX;Z`ruy`}Ej{`e+el#(=F{Vdr3~m`V|mi(>5;i(<8vMfsz#MaeXOVehq-9u(XWM)-$ zRV!eIPZa1z^P$Pc3^~B?XAmGj5_}@ThXDu-2oNCnPGB%Z_Y2AHo~iE2N*R$6;qK;c z`f9E9<@YViUA61*UNiH^?C$DizWtoDwOD(fv({ZgvYv&EI}P>tNy3wit8)-{`$>Ag z49XHj+)Zb!OahLLcBIHit+Yp~a@=UO#Iu-5z15M!qXVHgSI!lks8G$9M(D{Tqphz- zqb0#mNZ0Y`*>h=@OKQ)LcKya6B)_Zn#Roj4L}O6aax*}GBj|^Zw#+E0=~eYussW~U z4~4Q=^c3tuA4$yi2LqLMAyb4*lx#X7qxo8Pi+SnP$`S%549YjC!6j$40dRMz41nEY zQq@Fh!;C7(WF(MTdr|AiQ8EI;cYr?5rPJxj(-+UA3qn2te4+|<61X!2{;NGn5c1dM zs-)6siGYxfWp|}gt;tCmbz)9v%d9q-$&*Z2FhrrJ+x8r1J@yeL2#JgI>`5joZO{!t za8nxd*+(C#H*BxRuY|U&7gFyGlnFwqDXM0_I?CX?&8I5f^tjp^4&?m&QldVW?B`+< z^tr_siwm72&|@l@wma#VTr~PBxi}y6CFoj7rPYpl;*0_Ze@@zU+CHS)+q)iREqJi^s(;r zZu{=Kr4DDFzIXxrSt!$pDvD&nbcZ8Vd8LZ>$zEQW^ZZ8j2LqDJ7o=0U6!cJ;LBV7~ zZqxxp0Q=V?@t{wBeO6KLtF1;&CW9f)r-9^w6FgriHA+b`KlbioIakSPGKa`~Y>lx` z_H(jxbSU4xIhR+5DVa_vAtzF559QTCTE~Sqx?J@ax*vVOJE~KX85qMN7vhw<>SOI) za$4z0A#y7%*~Ixorfe`0l?KXkObeV_?M_GNft-wykFAN-7tZ;`d@5 zFs~_`t7L>1B0h;=yj1b5RjV=`jj$iPlEnE<2OIn`fHoY7qqO-)55ryVORrzrvo()! zdG*Q1a&dXX4bJ7^`M-r;K29#-cD}C+Nwd9+n(F1O@#_9o` z3_LPwnV$?PGTfKmu*4ErpITEgIOn;ZXIEv#>686}&_NKH>BQkkEGBQh`(9RquBtW@ z7vE8e5O^9`(^-dG-d)w?tFOLLkKa_=r<5+G-za6rACan<18)H5+S0A0(h^cn8!m&fO$Ein}oexs@g) zGYxCHgT2(k`!AX)+@1-TCrVY))+udw(u**0_YuxOx1Z9H3Gsz6=E@E5(WMfrlU4)o zv!!6StD0~)9#>E8*#!16@Bq!;{)mNjngLf_KD=pMUYWZ5a`^Z}CcT!PshkJeXeBe2 zD%$+9g%XKpjgibI6LlEF_vajar^kFUi^=q(*@-IN0dx*TX=&P)rKto;RQAX)#Q9Oj zSxKo%n%9W!980G=)H9r8=Gs!izJYd$#|OoXw)G#21p5ofZyE& z<}-N-ri|S$n_hYsd$(OR*ubU^5k53O!C8jSJgCgQ=@?;CUV=S9118PXVdu5Mlw-Qd zV}NPSdJQ=9K6Fm_Y{qB9rhKM-yAOD7s`^2^$l8<1w!E$_d zw!5hx&bl_uiyh~zo9P6*Zsu{8an|eX3&F1QL(?Dn{6q4ZXL}rXjnP@B4V&tB-rofe zDgTgqP5g({!RuYB!T-hcHtlFMbKUM)$)jWL2qJ}r0T za4#dZ&IklgP}U?WK>&IqereV_l1axov6}wbM@LexwImK=|Ls{#c6T$XHa4BCKC}Yw4e5+vC!N$aQ2T^_zdSiAO7-SS z3DrkO1(gO_qEAuOPbOF{7XyJdQU*>Kgy`j9E+fp@r;iKb@pbFRB`$KdF<&zTu1PlNQ=AF8 zDBX3-s9S>Qr&>Ba>puVJBN?=t(!~7kW>YFdU_^aemyum9*mT`}Rb3fJ;;@{%yG{JB5NWt9Eh;;Ne(){`yAuGsi*37S-zY z*^7M@i^`x`mA!~hrf8p1Q$7&-RGD^RPN)J(@2+k#&r)G219y~x9ij@ZPe${(xKM75 zweq7J)iY@e?5BVHC-U`gzf)YH3OQB&+x?OL2*6X55`$z;JbAPy!B9*}r{75oxImRe z;w0;!x6)4!$pjdI;7>}o(+7@u<)Yq2U!r;d#ES=*bL7Q7B-4p!Po>^eDMU&XQF;-l znZ%+|gn%?}uJs3o7&<{Ow#X!B4KnAFGRIlx#aZ_CyPB%j9v0%NrtCpJdalKU$P{hz zETPx&Pk#Kz^6fWYV_TzsjIlQytK={yS{Z~~OPpfz_-GgVKP|6+^BX;PR+xh!%2VPq z5%%g24a31$64|7bX^YSA(J?;C#$}GS;(jmo#6WhBkFnq8GU(IOuv_uF))`<7lxp+p zn6tnc+NI=p5B3Xk{@ZVbP9^HYsqE%sYMYIA8=KfGKvA`ynZ{hwL;@Wskx4`+5V5cy z`)MkxP(pt=p&dOkh{(k20B_kA?Xwc`c_u!_8NvRv@eU{^DEaM1n=@%*59QKf$zhCM z%oA-Ik}*f;FMNlFaIO!qpMsodFZMUiqH+so3FaxD%BZyTZZ@XOYch*UI7`W7qk|sq zlR%KN<7@Hz19EYGE_u8kC{ad6R3A%r(;DEM5_R@8#u*dCy7FuyLu`QxD6veH?vqEy z;$Gq08dD07YW;X0&1e!Kf_VXs1D7a87skAnF0XWq%Go8Z4)D&wxQ?6)#He5D=obe`FTr~_ z?|3CX^L#%$JCkB6DDYRxCXNLDj zP}TIm#@?Zw!Zh|S$Hg_IiZNBWX?}qWTskay{N#~TDm6XV_)YOY{ipv-$9Ny`Tjz(u z?^D*mL+UW!Wt-sNRe5Kb-?tA2?y86I(7K%8U z`n{>ogooy3JOjsI%9!@=8`nen$@}}})!aMtnRq+zrZ(+#g1t62*!3~pSr_B)Yl~pl z^C5jUePY_CbQ|nEOm~jQ-emWc-_%Ew#_L__ca879vd(ee)#pv+Y%pb=?U{JCVb9S+ z>SKO8ZCe==$LqGb7;m@FIOg9rKhApYi?{2!D=*u1<|WvDBW#P`RDRR=_<{3~KAExx zHs#|p!LFZie755rQr8d7<7}I7U)!7dYv8_Tf_Zkfx9NFXUH7FCHs!r9ZPPvBA^Gkq z{~_?9b#98c)>NOMEXD_0I7OJ$t`lUn*E9NrYkuFVMX;k66{n@9D$gLvK~Qz0G>sk$tQj7&NqCx?6TtDpZu)k~)fy#Fyb-TAGw))77020;+{ ze9G)QJS@oDch~Bqgtqyjv9Ju$r#{*tVNHUOHkv+rT#yb3#at#%>PfzRUsZ3bG(7+9 zc~#YWIVXXDN4gW*lbXq&{^V2X%vSQ|-Hl2KlHjV;8Y(?O;*Cs}P#_?QR7@prn$?d84+@f_}GDyC8PsVF_SM z)Akn))VsnFdG{WD0FfUD!Pvt*#IPPD_^96P2HKQqqwgRCVifBi@XKsGQ^sow6{SJI zp~JT}#3%)Zyi~OY2FiJ(C;#a`{4@FOcW;4*ONm9oa&}!&=@Sz1lxQPX7P1Mfr(60B z5Pu-rsU}Pn)k{hz?qsCa9?4E7rjl@EfKd%@jxp|JlhSDSC4@B#he9f0^Zo00I<6fM zuJqiRiiV|ywbQvrJqfH^1!eMN?oP0dVL#@=r7CSCfkQ=|{1Mg?{lyYWwb_#4aHxba?Zx2)#Y|B0$|d=1Mvf15 z29see!5uvgxe+ z#lQWx@;Dz?CU$GS!kkPc9rdX?>SbeyvxN-rF!uXQ=uCwwk6c>{#0=t$`pvtVJlTn>`G-<_jI(ei$Hzy~8x7GT&N5X-7jjc=pyw{E zVH$Hz`Ci(CbjuFT@$%Vw*-6~0T2q?%R+ZeNW*wgH#Pocaa$oeY7f>=8^NSz2$vGhN zQ=QIWeuAjr24no{t1sp3;&y(?7)wTicqff+=NtKWR?_SF0nV35G%lr6oRip-{E><8 zJL1G*y_7@XE7f`v37q|SpAqltcz%4GlQ8;!RR^wp^&|QI^isU8CEgR0TSqy-U7(|$ zGH+>e!-w;SX9y_{hO1gzK6>#~n$3>BuMcuzeUHAoX(%)DAfLo} zJyhpJGzCHv1I=1h_Zw}Zrf}}k0TS)WF1!Jpr+rD{{H7}M2n}#PI z%`nD3o~`A7^pEfNNNj)a{1A9ZdFI*nP4@f353R%W>8|qI`t5`d?Zc*eKeUc*VCuH( z+t!{Pw=K^@U{hHqO~iC(9s?|Ix5azAtN~{`R1H=};6Lj9qu)i{f?b&b#yN>nQ<*bA zJI^%d01Pm{DQ}nEl;5N~+t@Tf0}svX%tv@gUUP5HhXJOUbTd9@o%YyFUIUxjcjn>q zwzduM-qf{e?rnHToA=ENuWZMe&)MF6ZSmeYHfJ3K=h&QiHnl^%G_Yy@?DV_($?JW6 zylWmdl{Hs}yXtnP-PLEioSkOya??H~m~u=r^Gn!NpFRJZ>NELy-PX>wy0*>3L;7W4 zQ=b^e{F~;|8E@*|*5;=6HkG&YnK);iEK6|aB{byaVxYn2O+|9fTjsQ3a4Tn1*O83F6=sgyzR5Sy^MPY5e^4X+=WF z6F{G+wnzdY3*u#r{?e-`=JFGexbRl_r(^S<;O5H5iZV3be5|2kzb&=etQ|{!$8&>cm}yh~EW#q3y{9 z2=IuM8Ut($kr4VoDHJl==$VxEA45P|N)A=~V|lWlLt9IU#iJmK$G}mqbZTAM+eygj zWdm~wq8|7~qO}6TcLsvK4&3_W)pJ$JCIhFedm=9m z(&9t?H^8S-qc6`N?Z}|hQz=9`S(uJ77T|rk(UUmVm*Xx02YlGbbn3Fdhw&oryZ2Su z1zya_n8iHo7ZcKG4UvybC{d5HufF_=I{X=eh#z3SsEYoU4sx)cJZ_u{zyX!u4fy2b zU{AjJ?tA$J^G1foXMg%9^2?upEA9S3_e~*_M4wv9oFS9u82up8PtU4k0Un(k%Wr=1 zEAe9f(z%3q(8tx1UQm7F2}k4{dn^_3N*H78^=OAJC}*{fJi$IB4)S~`?xclw=VmLE z#lB8w=p<+=!6j|Vt#$4x71lw&DIv+c*Eq92|Kd~WQT-ilM?-%3`rVC0P(Qu8ay7~1 zA!Tz+`q3$LUr1?53`acCIh&h!US^pEQ|F z%A2?E<<(JEXqS(SwMZ%<6O8xzsv$}2nMRYU&q49IRx)zks;?5)DG^slhvoT6QSBh| zY<_p$mPbc9xhZvkuRdAgoI_@z_hNedt&ZmM)gS$_%!gfhhjTR;3<7uiz(aaVzTFr7 z(L{fMd9qwliIcAN!Wxg$LuYWFsLRcO;pS1@Jf=4oI^zz&znh$Js&V zHtijHf?@T}O;zCMC;M`JaUpxjuq^R>S!yZ+728_zDnzCcw(|<_ATssOuqMwR7i2V? zsBPNPbzS^uXFQzAdNo%D7Cnt~E-9hOcf@G2kTT+4Jv)(dy({}TyXi5wMvuL~2byP~ zbTEHh%4QN0jYcJxPD=gat+YotGcZqd4n;NF-Bd`KR{Rm=eP^OhZ*uvp{%A2APvlWC zE#KmtBGZeEOL`Ipvg&@ILz+MUb2Mz}4=EYolh=)JTdXmE#Oh-{>8yvU#!aL@+DqZ= z7|3ouE+zDv%Jr03RLN`pNQ3(6%!udh5;$JNUjFQhFXheYd(8h7=VKH&P6tgRt&{Ir z{@~#8`f-M(B#}zWcfa{o3JLTPeF$T>y{>d50DO9RnAZJIJfJ;XGVkcExOj9dEqo*J z2O(+=(7eG-xvpcSl<+}5t)@cAz~wXdqHEGq^A3DB(u@8W`+#57Ja3;JW|5zs#rXrI zS8i}N(|fuHh52I^9WYU1l?-;a$N8aoj+ZZ+2ki7Z0-rnWAd4+sn;0@Ccnu`u=`^2 z5$rq$9-5cW?5i{HrhEj}YX<_;>_Bj~@2uD4WxO-5Nq2&skN3_zd^UM_HTNdX1cF_c zoyUgz^6;MVcALDKc1(CkJ@y(fzg?ceZo>pq)|tlyf)WV;lWqsQEQ4LvlxMuT+Vwlj z+vQ9!X#`W&ZkxcXIV4OuXWg61nqbP9uqn-yGwl)VG`pOgW`apGd7bq!n7k&QV8@$4 z;CP+&-4)L`g0mh2CeDoD;I`!F`~%*()M6K~&}tGVA)w<&MOu`TDi+HIL&>NNM8 z;#dd4S>Lueg1P6Fd7N!9&VFXPxi{BM{UU73WBSQw69~-X?4zB>q?>qW-<;P?{krdJ zgEQ`jzrnvv(|KWct|LR}h5p(fiiTwYqMmA-pckakpMoI5hc}LEVgfz%hJ7yeJeUT-P1|LD5WM_I z|IPO|@@zjPo>){>OzF8Wjl3feR+M7k{Ki5)@qwryu@XVKVm=8X!6Rqomh6B??}Nzb zlK|?DBo_g(3PKnKfF~39XBdYMO(4PSI z7H}NM7xKC#4IC(Ay*waJ&r4PL?9-2gs+eKyJ38{9r)V;SC}xN40b;hQ3}WI1r6^yY z-N*prrjr2L1!KKr39t!rFW&h`?X+Q=$pwhwLMkjdjGsgISnk_z@e8BesMM+VH8IE+y0j1(6GSm!8knUc3fI*>s7 zg?t>F1%m>zkXc7*G+t}cej6P;>w>UCMoF{jOr zq|#YAKG@a0w^z)ns&0Qc(Q)#8IDLO1leJfZ$&943MG3_dl1W9dt{4yYC>i*rYU6hQ zqFO(nDLhm|G5TUeI%IwL8|myGHvnGE2~3;*l4)(ZU$h*mG3vr!*#= zd+eed&$4#2t2RRy=u;N$lle_YBQ=aW=%z#)a1C=oFSe9dU9@>N4Q1Nx$tCvYpZ)X` ztl3Z*SCn`r1DFij7S6IxyCZ9i!ySs@)919>kwiKoJ-lZqof^S;*q^P{ zMrj-Gh$!Z#0X*k>ij1)U=5co?i@1?8Ciw%04{e<{`jWy%iSYfinj_5AcHn1U{7C1X zj7+M+(@rEM3n{(Y?R4b2RF}bAB#3i0p2%_hRamoph?Nz7%tI}tDP@JAi~a6`51v+El*3XTjl@%uJvfq4tFGS#wCy`X|1N6-tmaDRbiAg`O%LXHAS3KqzGt|W z_|O2JC4l2W{m!78@6rB_jC*Y~XH!v?U<~3tLA7_^9Qy+Mus<59v}UJKm3MExldIG3~AB64~5^Sy!kf%kn)@Id`S6C@S){5<#X2I%wwk+a6TI_c^Pc_fxu^i9cS`7 zVOzWn&iV5foxGaBXQtc1&T9vPNq=ZQ1Do>M z?K$h?)!Y+IUWOmqrZe5tW%BWAz_exZ*!7rn1HAuG#-Ck}Gmi---sH2(@@mpeaF#da z%+*eJmbc3>m@)?Jc6l{vruU&vV_Q7IFm_B} zUA#KWn10*w1e0#!P5HaxO&o)XyQ^*j`)Sv)DUSDMJO<4Drh4y+Gr{zWVA?Wqyb?@a zXMN88m@DDFIA>kvY6sH?^K4*K9ut3Ge++DU=GE>S;h|*>*w1!d_PjFAq?tf4_jW#K znt^R;_C4Vt_uJsE{O0-h%|o!~X;WT1-3B|IPCqbmB|>S(s1E`%9E+*lr6uMv=vk|` zz%@R|2lKU5LFB{`$6x0ujYWyD2ndr*oc5wbojZ_NS(BPTnHH!eG7k$>odq#OqxF<{ z3npXIMkBO8M&x8K;Bn+^666$Od#ax*>Q;~uRstMv$0#F<)f+G zbWvw2qs|E^RYHj=O2U=uO_fF{WKv3e)>=JO?pEf|VnJz-p%QwuO+<;XOeml#ZR8ES zt#@VZ^2h-V_hYU&Uq3&qDS!nx7! zYO}8%I%(&th;&M_#6ZY&T77Bu#!>|_|NJN;c@T0WZ~`F8%9V~XW$2~R6YzpSVz~7d zOatpQr0??uZcW}lMrIO-ni98k5*ACAfmh@j(aRBe$_3Z@1EGm0@U zK*Xg$#L|gIZA_+|UqX1_lNk~A-r9oOONNwLM&ge|_XGsqx9@8zftKGb%IS4OZADVB ztw%;1+MxR5KGMlte0|lF7>Km>YN>=dCFG9wb8>?@JI*C!HYT&jqiTD!dDsWRxta{+ zyNjwifLMc|_W1*nO2w2RO6J1=1aBf1R;d~Fc#K7%la}SMFTQDCmeaAWU2RC4VIVj$ zLB!L_fQ~KJ$^f9fJbHGeeKD%y24yCbl?S*vkzxvj^>QT?*hW81Q%^!WtBM_kXEH6QM7qhZpfEk zeFXxTw!)UOSIkKTc#OB7+8(^Fwx!+c>t0PIqe@hBEi&j+wN%EQ#Qwy3esYiiu8$;- zwts%nmIJIenPXk{C+1hC7T2G6Lbdw_)*%mKyg!~u6!Ra#xMsjF+Efc;Ur?2ob}A`p zlm?Mc9BTm|F3LT5e3+KqVoCx?`}(x3`-@&rY41|KYXkSwz~||pC$nx-TK%D%Ue)FA z{+*wy^ieJqmtE|sTDvd9$rSr?p-d9>cHC+!6CnXSCPRug+-Sdz>ZET@&tx~WmP4F1 zWZ-mZzZ83t(rl_Oi}Q)h2|CB1Iw;j$FRDG+ONC@IoMLarC5kznV-InEklBn|#Y@@; z&7(a`v#iHcxoD2$xR8`k#3$Ko0=VW?JD#*{_O9H*c^8s|&n5X}Seng-^g3;I`f!4N zia#hJr0wQXK%=GF7GyikPEVSxuGAV$T~De4UsqcyQA`zfI+>xfB(4v=ArG5PS1MndGp}C7dHXPv{-|0DZ3GK8SO1rtd`&+TDzx9N&?|1$x}B zx5vPciPc6?i(RQgwLlQ=EmAQVaV0z(t?%Cz2d+`Bylv zXbvEX^>ulDdN$Lc6P-f^(5HHDBpIBybRctfelE+=P}a+ZR2p4*^yIOQEs3+4Kd|(% z_jv}5us3LD(1mwgYluA)PsqxH_hB|Eam;-*972~@a!sZh`b&lw?X%L8J>SA)!uA?1 z$@-V-Kxc`woXAJJu~qF)K$+mQZAxZ8e}JiU@t)y(6laqkI8J+rWXQU(MqP}%k9R~1 zI8ea3%6D7@d+@y4QO4oPep-K+;162#0N?Aj#f5ife>hZ?-e*rAX}x6Lr*O8m=#?9r zo)XXXYE9N&zd8Y0;jDa63wGK6iu&Him z8T)F(L+TGX#_0&dW4s zegk$s19#PJ1D~A|e9pYQntNwnwzH{Dg6RXV=AK~cGr{CBb((wxQY~Q3AxG$f{ zYp%{d8ZdboHucSvCphae!IUTPYU1rSO`4tezV@8ye75Ugu-h>AgiU!&F!3fI=g_Xl zq?_O@Z_1ggo$f4emt!zx3^?mHX{P+9bd$%V@%qqq8Jy+pG-o*zZ>KriGxeD?19lk` zOc|4A>LTzEvgD9Ca!)YNc00~Cx4{q1v#tL7>U&7~+i!j$T@Yma zSO2f^)EWPHOSE67R7oNw*_}NZ_dAjUaY`wQ5hzI7%qyg#YM7qhV(IO;-W{qfJ`ydIHc~Zb ztkD`{WqnlLB{OIOf-OvmkBCoPAiA&X1Mz?mr=7*T4-0@gNYIhcr4+*z#+grrq~03H zZXvGHm6VdAji~^}6bQ#u&5Tl!O%Ph|E=#Ho{B*ydUU+%R(76BMPEIZ{AC$CUD@hPHyapJP}Pdb`JARW*R-4)-cy($dDPN5}xCwq_8%`5gNiD zfY_v@8f}w(_pTx@9_O+C3-Mx{6*6l#_;WFE&vqLq?oWJ-3& zbGd4d)%gvjx+rah4k!b#gtC-IiUa>aW~xdXnZ)z)Or`eTR|j&qn^Fls&J!JT+@K6` z7$=p4Fed@b4e|c)=`*#H7y;p*OJKi&2yV98x*v_2DVbNq6-r9db1bD*>6GP1pS_S) z73+<@QR;7q`QsjWoC(Te0lY++Q>-r~S|h+co(g1s)6oj&V1o5vzMJ+?rHZ^*2QnWi zZsd*)GQA!Wz=KNFF#%M=+IYS1u|&`TXU+WI%w6*DL?#yK9-tEpyGaT%ej; z2GRb}uDItDsgvo3Z;H93Z8X~b^C9k6@9G%)3TI0S>lBhS){nL^F(Y`lxzs)xnaOl) zB!iBuhAruKdUASQm6Jz@x;}|G_Ha5WrCLMhgwlVMip24Ob1ST>x0Jf13VCQT5v-sx z@+!c=XT_L$WzA)x^2_t46mkA?gHxTKKiassZ@k!_Sm)(@E)AZealcB=(s{`U=XwbH zsNU{N0{fIdz>uLB_q!#V3<1|DeYKD`7Y!+9L;7RI3g`MowWIr(b~$;L#&8x=nvd$< z%YH-7D@~jyZQYxH=Z`*9HPJctS0S6k-fdt%-8v}ZIYfJkbhHx+1=SG@C6+0HN@>bY zqal~2ntXYZl??hz$?#HlhI7>e-1iDjQM|K&&!~$IJ$MF<5X#NI>{5~&>73Ir_Hr(t zlq%*njkPDvPnIs!L5b(N1b|OGo8H~DB^ky040CvRkdrCajb5$Mh`w{F;!cJyo%J-T zWtrg&y{R`Pm54|T?+ZHQ;XQf;e4O${t&C-=c@wv}$MwB57>f_}WD+s0n?JauGFcgR zni5;jffE>KXQ<~M&smzrhyo{zh$qvR(yBbCud&zSh^K=fA8;uE9Q0scc7`)OM~L@a z+g+T!Nu&kv?x{BiYUfqWiiJ&1AK{wgVN~ql^M)=q!|lJk8`|k#JREeU!RqL|2QwuNB$ti^ULc3Ug1oB z_3T)_e{-hN%G~cXDZ+Iq#wj&DQ|$se^Wu*WbJ}dg`^g^)E7O*TNgMN6i21P}+{&z_ zls6qU`S4BB!rAq{)RM>hS(S2Teva>~)KMuz;t=~tpoD6_-BCv4VvIAdxFgNVjr{Uw z|3<$1`d4ys`dS{p_(=1bZ>amer8dFuQX8o!nF}LVer%L$L~|urhb`2(Jr&Co=x#A%Q_gpsh>=@+caa^ zR5!udKZ3Jwti!oBo1A<&^KEN`!Py4E?)#>)tlv2fXWT=|ZOX&Ahd%SlI(ap54{g^@ zx1XKm@5)QKuP!^yhWqN-1`n;@2_~OC7xw)_>e`n7hxX~dyqoGZ*Z=$f^}kZ}%Ah}> z#L5UnBkjPE*+=_3a}ZrLXrGCLD0G21?lt8Ygz9gu+Hwp+ZiH&{aY|0DWwxBF^utYi zA{h|LB;@HJq%~RTGi^Xo>WfY{&MIyBAOG}3S|Fs8DG+sY5aS?3OQohVqmm%}<|H;f zAg(~5UG}DOxVNLKg4s+;Dj-y-25aV$YMw{?dmu`NlF6n(M1FzG%Q|>^;h4YVSkemajODHCJ^gRf|{;fmv5PNAh0OGQUkF?0)-Nflxz$} zBhpqoTO?$HG9ZHle^fsu;YNlCnGluUSbltx0nr44o=n3;6vV1W-kw*~6C{Z$G6?+0 z+b2T+MB)PJSCx*u`sk%}S}h$P4Wwr?T1(PKA<=-Fj7a4i03w zn1V0`k&k(#`X&icN`O(N7OSoVDxD9|mf5)1kr?Khs*hw0Rr^zAhR`7d*-vDmT!P4= zy4;^UEh;mGm^(s0>D+;iHHOIF!2Il?e+kUb8sqR_jw5Kl4C2fa4ugoEstOwIZ}mGp z=`BE*V}8G-x)&X(ppV)8W4XGzQARW+95WyUUtiW#t&xsg9_?g7jQVAavgG>>22QRVq*HX=jpQQA^GZ(*D$ zM+v$2&9NLN{OZYjf_5pX1k_RQp`Sl1O072mZqCJz`a@AnX?s4Y-x*M)LxdW>1RgsJ!~*rJP+r&7w1d5Z)GptvbR(IyRN*B<^LffI{W;H~Tc$D@ zB-r#A_pJog1RZp*$?O5nOz}LOE7SgcsV%$382S~Fxk|f@R5~y)pUTSP!;V`iqk{G} z$#mfPvA=_LnN3l@3+Log85V1-gWKztlpp;7K4y=fNd;@VLSM)L8jVJBRj!K%X9_wY zFOGJlguOKxPxXA{_XhVe=km#M0iE^8yxSBnauZ*}*u$;iT#jhB4fuy6RwkGqnob}S z@*3+v^;j}J=-7hNVLU77+4pfFE@3i$(O>>(;l&=fysF7wI-=(^kX;#YecaRgIDZg0 zZw%zgegbDy1m`e4Uc1!RVwuvAIR9}xCd*$bg`bhQJ?;BP{ccj-i_Uu4>I59 z*yoh=y2LtBl8y{xdiW;p?qePGol)z{%cGQ}c8c<=-@I4px-9m4soa(T`a$PctHoS~ z==)V;C{K@bDzQf9?PaAWA3xibv+JfZg(?bo=rSXY4^XCed_UZ3a>;I*hsT;N3~dLQ0i$-|$Bg zdf^>oe;nlF`U4fE*(q5(#+Y3^E72!PR`Lf2?m5~%Ms!Lf}G48N4{t-v1vsR~TSG|#g( z=9dn?D2YfF=or2|Vi?mK?9opTGcpFwkU>gQBHW`*{!oGW;SX$-5?|xYp!6uuz0aQ) zbj=1h3qz4G&gqhRo2Ly)Y9OqTHw;{u;X8+mRql-CkG}j^>Zo%*8)F|*1=}ls=YQ}& z(eV;^?*2aTA?3|?nt=~(+gYA)UmcsuIN^u%gYY3^*;eL5$Fm8Xv2|R5+QGnmc?l-XhE4ehCa2?m&Eu67>Yn|M2zJiMAb1ZTPlCd~lvonta(O}MKLXS%bzUCsnkmf)=0 zq?z)Y>Nc>ctO<5J1HqKtROemgxVf2T%JIrT*jCQOJJSf;>ND|neg?Z9f{7u-xf%)S{JaY}}v zuQPh@1rbCWar`Bp5_AWJv`Q)Lr5J*g zQo;CWXNr(P*k_CB1Hv$fFH80*&C~n31K+17avB#hrq5yB%F0s(r;sfcD197$YG_ z^~gvvDHk;|jqzS*VQ)aHn5zSTtC?m2WSb^661pR&z>FhE>%W^dROAMCfQL zDG>W1%pL7YQkpNGDF8oiB}-EAm{gi=nN5LD?Sbao%V*@{M>{fFVUAM?dH3e6xG>I$ zXQhnmlNTSM?>#Ak(57>RB<81$y69|ycsv8qxCEh2^>KF)#OZLT-bYiwOEM2g>|T)J zv6IAFkQq*|rneG`lvYv+MU0vF!1IKXf*i~DH$6E>g=7k%H=hpbURVMLuIqi3?DNcL zLT{jCtYl&#B`8a^o_JHcQU}pbryyjZP=&eN=t>_rN$D^;V0f~Z$N0Mv3SypoF{xgj zsU5_F-7Mm$-WXM>IjZ21*M;4IKFy_8Ys$<;wNa1kA0EhZ(AE7{?$g1}N^0GS?4_cz zz!*rt(=O(FtSNDWPGYDE&w8UsYhgbRKv2_pP8j$onDaOgI}!~8XFzmg+?=0Uccd!F z1>mt4eWTa!5%BD+HpHCq{pON%_I8hc|L#VmSgGpy?y9P1ObTF&{TIb(BC`gvD%13dMp<$75yU?qOdiF;=!u zyLpt-V!2kUBRC>}1AZwM@_K$8X2LQhBXc~H67Avnz3P~W(zBEVd=DHW^NK%UjBuur zsglBcQ<9l>Na;AE-XF{PRYjie(iW>vW|)*H@S=%1;(LNlZt^&gDHS-weA4b78NW2m z@cbl?cfm^SXwr#Ltv!~nFB@`lv?FosUpmuS;%u8?4X&$IX?MEvcpvKzyw0WLx}RvX zl(W@P4 zkPGjagh~|BVa&HTZS>KlQt@=EvG??2#bq+?DGiy=q~y)}OPtd^#e-)@d%)|2GQ0Wp zNd_Wq^HpmtS^EOmqdrOI3ld!1nlNCS1N6H#n95PY4;=NXG%uYt(b>~Xe~`epEc%d& zcw~(CAQ_sJcI%85z*jN=UE;<5^kA{(*weI$7{hyq66I3)EI5+6n%ZGi%cXqi{77zN(b@Txr=>>c*pVqUBQkAqZ$a$m+JXS=d znmIRAb>H3JljW!7AY9B5Q89-}OOh@uy7O5;<) zoea{r5A*}pxQy?RSj2~KgsiGQhw+{xL!PD(C^49h;kyOz8#?zo$KJ&xOO7h{*aQ4w z#~%)>bUl9vTTmJqk+dE8m)~DV+&#m)bR>!Vj+T4#{de;A``^lMe)UUv`SGW^UM74f zd`MYm9=q%hDNnes{6p)t^KJV!HQ>x|;6ux7%Wvo1)E8&mL+UZGDX$%8>b{G%GWX2G z{5F_08%!CK=DhxuYVfPstN*_W4cHwrf#A%~XXZ75`FPy~rmT~>!z~ZJACmF6EzOiSb@OWKHgH#2!nSm~zji#Y+Za+z z+te2mOnwtKrJ3^g)kiR87)(5ao!?F~&(1P-+@^SzBW&supUr#_?08d$Gu}L#IKrkm z-Bh0W?7Yr8&2>}z44c|{NZa-^f%hzD?#;??9O+|@^3on`KO zzOOz5Che{!YKumAGTmHBl8;>5R_NCnp~zxV=&8wjS5M`%184@$JH@ZsO<6d<=}8% zu5U^zO-3mbH$Ko`R|ayBi>X>#%;ym|h`t^OrwoW0s)?cps0;54T&Z$c*vZPT-ju`- zf|lxD-VmkHZVj}1K=5AIIw0T{+J{`~mM|j|kkUQHVo`qntFL7z4r13c2H^-|2gK+l z8CD=Jk|6%*rSpb%`eG4Df_SZzZlu%h%JJhT$_R*|?-`U?qiZyRPhT`Rij?9DhNJTM(TOx~&LrUl zae8{GYRhDp(DvLAge{G^=P;&Wt*UBTl~zv+4rP`dohT^=mmu$7DHMs3a5}YS1nhC7{TJop3zp+-^L8b@L!@DSeEEOo?I= zV`-1&syS2x?{vIC#vxV2{PD2-`dwZ63!gGVJ?IM!!c*mt-XW`vw&F)N8CU5y+Hl0l zEAP%PWz_9Tay0^8c-8jYuP^IZCrs<0CEmqE8K=)behK1l2>eT^dTJ~j0wD;T#Td!N z?e+%Z35I0h4XTm&(R~_J#t4+0y^~H-55aze`*@hszxvkkY znI)6)SUS_S%-jL>HXHSkp-Jh%xk^QrT0<$OBPxYO@4d9wNCpqpNGVZAqC5k9OyXJV z1@d0?mvWfJUYX7$MZ2F^^GG5pr`H{E0b$Rv?>L_x)br%iFVqnP9S%@sk$ALR%#=Yz zr$HZ|6eW|%ND})~u+C2&9m@5)cd{OKrPc09GT>1=b#!Ku&t_D$lRpL|u#c&t$Z=DG zk@sX06?bwHh$dw|>?@KTcm5c`I_k}ygwngxAJ1`iVxDoJ^t&Ck zPfF<|swx-KNjcifW1r4sFB4JI2B9g&+v&;4(?@c7Qw8qFl<7$uigdidvxsX(No_ho z8LhpTuYkDUCWNgAvBKkhkTYGS3p|CnYJVx=D#F zs>PNnb!lP0{>eu>z$Hp{yRip`ILE@$Z8asENvd>UIu=zsu9Pw(lb6hFZfZJxqPc*j z$1B;L0@ieZ`6go%dk1~0^rrH(kWjqj7nU~?kxp-Dh3NeKT59 z0V9h^CP zIJ3zFrMKn~+OKxTcqaj$fv{7TM{T51rJVLLX$!VLn8}OdoW7s=g86@N`c|P>9wv9#$eOT+fErF}gUp|*{ zyP^0$sz+Gh@@@;xo`G>%L z&YT<0INsaw&UQETg<#ij^4W0&XPmP=yIvc%<#ApO-1qG4m-E@&-}P*+&i**ZVBg=B zM%b2iS3VoI)xRx2!A|3P*n!Lfb8pT<1H8X4*!k@H9}<3O`EP&ya}ZAf84m`^6jNqW zs|JFgFLiw6KYsE^)~mV1<588^!VD^tfwuSBAi&9FIR*hAOy{Llt*N9BJqQ+XeO(($ zf4Ww?Mj`JSgtkwl~g*Zj1(Hy=U6ErsLWmvP3PAYIXp!Fg15%v z6Clp~I0NW~m0Fcl?S5W}iVORRk`(8?nX3I!^-S%!0Ue{jB}!sN(ML?9oYw~Oqpv=b z_t$M*N1%YjqA}^B?Ewj55M1Qr^>wi+@4;rafiA-P;erpWhrFRkifbV@-c2yF>c^>R8zzd@MCQ%Onf z9LP6s&gC#20Z~lpy0w(L6SN&xwLPl+_JKQO3dX|$b(RAJ;ZRjthAOv|C?U@Ayri1) zUs_1yE;+6Au(o*516NP- zWO86gAi_hy*VD>SrP)?M7^>ycBQd3eD4|J49vPpV!4UX@J(Ntz`}e0Zs@EkI^Xq(| zdG%^b22xOfmy@A-=Kb`Om(p&xC7({Iv@&hDk%3G*rG501KU|Pm6o|#eAC5_{(~-k$ zREGVDG=L+`-YsJ#=*Ag_{*XD*ovhTpAIHld5~%)51~*mY-M}|W(f#(St$4;C38*p| z#2MrPu3xtY%3MfcKhH7N1*MyOew={|sZ?q*nsNDvdEd+s~=Q8oesh+cHjVRhy+V4yqzA{UI4*PZsv~#62BK zAsg2;o|l!*M4s-Y^h~Do@=a@~??5l=q5~Z61)4RWeK?-&1WIYEBNgB;ovP4FuO}2z zrz!N3?WJTW&M7)_N#~0=SAEhM-Kt_!eP8X70v~8&^^ZP&EX^U?^U3aRUIrN7dATIT zSXg8}!TOS+I+VvRUf{eMV4QB*&64Sxk`~@8w1r2eQl-`wS0E@MGF(GZ>Gu1;x2W9k ze8t`yk~xd@RTC9t83BJP1Dr+Jqm(k|c{{;5%J)sgvz96HbM)`=etL{^j8cU3D!iA8 z$_jWy6=4mY(a$oW^nhCtd0grd)4gABpS&_x)k74AvfL_Qz_1 z<2}xpU7VeKcTn1~(Hr4Rp34|}=^f5(o-G}`N68c`)qAL~hjY7+bzaMh!<;g0V>ln( z0oti`$q4V4Pe1=enc!66B}1FcINDDnBcAVrn^Hwpk{6zU{s7g-SwQ>1ZT`B4{n8vz z@_(j3_>iGZhbWXjrBv%7-g*47gJu`VtVDKIhbI&Bra2TZ&i5?#FPW7d;LsZ9IT`o- zVTO1a!~2l$L_f|KGL#qmfujX{j)(NyB%Cd(gQOoozDjDs)MjC-UgG$T<>bj zhHZIFFwagf-~NV9BJiH=8nEvT*mc^0;4Ew64g8fv;Kz%P|EghUBj%auCJzJe2~0P6 z?0aWkUJaOhoAR1qz~tGM*MLd4!Py6bozL9cOej+))11Ls-?qG)`p9@2_`I!M1Ewxh zpSd#L4g|YR-W%AKhk;2^62XO}Z+rW^yoq?xNpGx<#*@I%qAk5>j0?<`~La;CA2 zi8pnbc)KowNwe#*;|VO|tcQ6`Ji(54)?b2wSyw0`=CJzJK zagKrIoN@M*VDi~<%x|~Juqlquc3EE8p8afJ37hgb>#(l`JI;g;eSSzk4LI`?Hs!Hl zTi%D(;Y=ei&cvJhyMmpM{WojnyeDw{3^wD>q#0lt`+T#(o*(<3VD6n|2+q8B!9(*I zFm-?O#ZTm4{PX{pe*BY=qeKB24|9A>?c8q$80f@{mZ!x425e z)EjMyBog9}rz9GQf{^PAZU2ygL}TV}Kv2+|=spNNN-F&3vISz_BNHLxaD|WYA=;r7 z!$=uY1rW}+_Mqt5*Q?$_dySH0qi(smuBeJ1r3J~3S%Rpgln+%2sj@}J1s#`AvLOhf zH57}gYF7D(I7oCs(K`WcC>2E zu1f7ZeR?d3LP6f0-$*-Ry>C!%3h|0ABz-rnKSkzAafN+#@q!C zO3d$)d?6v%Ao^(2Fo*jg`kKI;O+h?{feU2FM!ic}&ZhGHWmOW%gybH(uGvWyFg;Np;^I z&X&<|AiZ`&p6w=;Srq{Ow&s-RLjRG^js4(7JiWqFrMXtEs>&`I)clcxj6m8IT%#=> zfppS>16n0i`9p=PK~lHiQMJ{{nUARZSIK?&j@8Bdndz+hXzCE8fz z4*~&7q2WxSV-9+8B?FVT=W-FBs(|OHu8X>8-;C7er%m zDFLrSt|{gZ>lTa1O@F46oIFG5REf6Tg215__D%qG^{{qVHJnGv;H8YJNE-OUbAsN& zsp3idgOrBFu_IxezlRv>uf9K*J)CQ_^++cgWCA|fO{t1-JmA3@9RQAvC4~Kl&8o~g ze6^_5B^fr$HO`UtL@rt*@h;|SPmgCP?e-CO=pmP9#sX(JO(u{T#yQ}-;h>NO-r=0b z84?ahq**D8dp6Mbz^8{Y~hPlaLykp?#MYAt`yeIY!kMT}i0Y_$-|Cs)e@%G{dQ@7F| zs<_W6!A=RgP$VvIzkh=>YpPClC_zr#A<%Q}dNq;hU?@jVo=YqgP-#S(2_SQejC(Q= zDM{Dq_QV~GNN2hdKi;X6(NIFb8>-#YRwU<>>amn8CDYoAcS;L;Z-lvuVmqrTAI{2c;bH3{myZid%4jFfo$wZw>aZk}3 zFu!*Wc5>)98ToiuQ_8$t0xnIZiFe<6&=uEmuBz(&!AL&+^kbDKrxO#txA@}#`-ZP9 z?E3)vwN!HkUV0w}e)(2Ym2^L=w{YfRy|GU+@i4|3lPS(1kI$#f!U+1$Gh>Vck<#ot z5jrWOias5Yxa6!l(0y>reDwey>3{^dk9RSdy;Py5T5}Tb`ioLqQpG*Fyt=`;g6{dW70cT!6Gw2?!!+KT zymmc&CfpZKF#Tbi2@kEqfE~xcd<45*!lt&I^FeU7W8a&r>61w}X^eBWYvKruv+F1D zp8YU!&NOp%=5f|T;Ikc^aRxR$8*tv+?bvAsoN@N^wm#Zd8|=9=^Jbpya90{(Q#^x7 zGhpA_;OzIdd#;Hc$kgDK<+lOLo4z~YzBV__C*i*I-v{jae)i}8ojf|+kz#NyZ)%hz z0!{+810b%bzDwrDY|xV?2;Ao{U#N;{z!y;aNR*(VV*{+7N_fyfI=%N&)#=%*kL2v? z8uK@o#~?O-ech38BBl0-SZ5+0mFZ-v1SX}kQi-@^LF|*^NQt;CB|~a;S%H99gD@Zw zyF$Jq)muTphT=h~b*L%|g04T585x84aHpLjdMX|F$I2|~ka)oy9`EN+&r;qsM)J|C z10kF5EuC_J7)2LU^{G+0kumyzdQ+2=gB?}#Br$MM%z)T!W1N^5uS+WRj#Mfwp%>oW zor0V^e>KbIT`pL(MqF3jyE2%RrJeTH=+NwiYpj#5@M zz)r~`GLNd&miVG^N#}Ru`KO=C#o4*UKuo(pEKkOBd0pwtPROl9Cz%ejKwOj$uot>gYSA7s>Ab_!MR1NckK%7k%%6z8ntQ_W) z^{~BfFWd6jiydW5F0t0iXl)OHBYx>kry%4!ibG^p@1#N?EN9Z~bR}8bm2#yn#cWpg z@=4%MP$gWDO&JL-;L7RQjl{A!afhN3PNii!9!SVX6>pC;&~|G?Z>%6LK{S(LweXNB z)RXM~k>Vpgp@ylJhP3Z5YAUTXo=zkljj6K}G6q8+?4z-mN<1c9IA5@cK_CPBi^E2W z$*`(|UpIk^Sl7q<8A+$Y`b|YOzdF`6i$1u4o0OczmXd5ZAhlXW!XT+Bnf2+9zL3G7 zuS^Eor3(c^Sd)qNi_8s5b+wQWco;{BxG7S96sTW%-=ne~ww5(l1; z@l2^qs?}2Ev_TKd;+B&~`{Iryq}ObrUu4qwlqpE{*LQRnk&me7Nksj!0{#wHB6ZALAc#2N34gEPj|Ruth$MYDGiT#l70CU4W$s0B2D-7B zl)U8`M`~Dc>LI_QTI|Rc;7sG{zPWup~QegYvd#T ztIbr@Pi9XA?+1_Hr;Pqgz9=^s`w1OyV1B#Ur)8W)w51xuypzF7)qI|*w8=^vfwbF6 zCJ`BUJLuzZf-?~7^F7XPa^&|8PxME!$z-f5uw>9(R2nLAjhT{{$3^Vf+d3$9OIw)L z%lGnVH;IE`CIPI`b!VdI^hqA?H|!%H&MTfxt5H`bc(2ZI24CTPP4dif(IiJe!U&is zeP2*Qna)svS~wHqQYa)PRoIoAn~EG@tW%tkKCDFr=ihE7s?J~3DGYFgKT2?(`3_41 zALuNLUZ!a)l+Ie{b(ufbM7{J%?p5bN*+L%sFRBuZJUhFCDc(I}#UFHCnY>&NdVhA| z{g+As$F9!xT%gU{<6I0~$N7!DN0S3dGF+QAeb3fLwW4ShTUeus{PJ9cHaY^T6*!uGMkG{kS zcQU~JuraU$< z-SlBoFu*)EFl|#g#_@cnYOs0@{>S})tO*9pJu^BhC9v=|*whKTZUfGIeCENt2_Bkv zQ$EwavkxT3Y}k~C&#c3)_n~cXnj=$}sh6;c;4}FQY@6>tM4tQFV&9x|wW%JHhxzYo zXIr`f-aF@bTX{2gb|0Pfn{sw}d(OAjZNQ|nj0pzrYuB##L(AROmxs=eiQ86&{n!*w zu={I(X`AX|J!Z|cuobvygWcm{jE@2b~1$D865+J$`c*O(Q9_H381{D3YMYJHER-|}fMBA;%n(F6RgB}Yuo^w5ov1R98_7Q4ZH;i;Io^m zGP20*DXPRH=Fvwc3g!##%=(l_ajObwt2>qR_E?S!ab+%Y-YFp%#F#s+9ta*f^uRp` zUfO}8`dE3mPzfdyzn?rRsIm0`^3XFRZFjXORh18m8%supO1U*qrwF(Of$Eo^Uv%Z~ z{Lz;xEk|2!*ap%Yja9{yU{o>b6eO2RfY|fO&DE8BahQ}A2(!=r-rtj-|HZFRzAIzo zO(zoS1sA6z+Hm2Ss(YdYTRIVurzeN<=DXJ*T16@#Kwq5{Weq~L3*xuj8p*2{hjRL^ zB*j!jmLNjY#f(3#;s&0rRT_?rtK>a_RZUO7xLLttPl2x z8~de+H9R=T$mLB-j*CgP9Z6=v+_RQybAUQysB5XrjaV!wVf2Z{^(pn1$tC6bqJsCN zPpX|B_C`_-^3!uQ4f02^QK}&1zx>fhDsfb*wp0>_QduN)iI-$tkr_|M!_i(&)^5Kv zOP4xUst(gLFY$#oAOG}OUYR5lPe@Wgx)N|G3}Tvf(;guENv1=N_R(0Dl4OE?K_*M9 zsp@}Z?!CXPVGl&rej6p}A`w5@mds7N~KQ_t5~ z^tV4xlte%Bw z1CJ7pyTm<=uf1^L?7}+&feik9E+f$(@DAr@$h%T=3uGGeoyR^FGr)PwCmCY=QD`|C zDua9!F+-mR4x#rFt*oWY~wQX05d%wsMCL8+g=Q>GB5e!IXCW$2>b zSol`5eeDlozfm&WE9cnLk9O0@JC)4QW9jz>GN;rf{&sjN_q}G0d-cyA4_i9ec9vt5_>z0evsKmZ@v4pC5v-}Uihgl-osq*JwOhf5AV2q zDyGagWfI3za&`JvRo97Vd`D5$n(tn|hxzX7V67?X${*CcXsh3Qx6V2@)@(?)6n=V>UCP_LY+A$|Cv_1NXi)uwq2FrQtY zvpwEB;|R`j1UsK8XYT*o{D1q`UV{lH(XNOY*-2haFktf7;LL0CJM;3Hgt^IMCSp@Q zrrGt{c};$EHTmo^1e4bUlgHF)=QF^2XC6MAG;?LJ$HHKznLsf0@oMTK*!i4o8ZdPb zOdWO}Q{LPYw&gLw*%pH-OCTZZ9NVTkOkg^}PPfb2=>~Z3#D#6;O&g}XGu@fSVE2!~ zPIH#E(+H+Lb2Vw3$~w~?+NQG{gR?#JY|=KBG2uhXF#aKZbJk@T9DF92_z$Uva9w4NN}g`0c>?wu4doWtmN|sSZ03cpf_2BiPTI zg2`i#*Ic*3ru2uzIp>t{%fI;VkT92Od!U{mCqvqTTS+b+6p9Fy+aOl)ajmL!Ai5~& zLu33@E2Y8u3_i@sIAOhGe3a8uCcd{ZpKG=CGz0NT1LkIswdby;N)Q^BPd<7f z?P^I9`0!2#v1T9?@a-?d=~@XVdbVUao_b^?PCyVhKs=J^@{4ayRf?(IA4?*gkh5}2 z86~NxPtrb@^j%&FVz`u&n}8yvr_IY!M`)i39hT?Mc2y;is$-yCqz_`1D#ld5rGb2k zPxX3j8Fo7I`l==`UObT|2t7)YrQ%_!q8x3pQ6hnol+9L0=yj2HxkymFet(U+d+Obl z%n{BBnW{d2K%SoLO1D{;YNal@kW0=gZOMT!pr4Xs&1F-)LQ-Wo9u3NMqp#kWDc(S4Km+qeug$cx zMYY%WS2waA_2hl2E+4&ouIidO5U_NXK?0q&1i5CE(jw!F5+Pm?QhkiMd{YH6i#5a; zs4h;se;f-X;8KVi0ylOK_GO4MkAXL}a#;>DAQG`>K)0$f_)2FemF`q+oB37?NyH;E z#=0ePDS3ZhQHBQlG)3KX1QPUl)xK14Hk03CU8`u9L_V-wa)pe%EwyEh`3ZQvYB!L! zw8)I1k7cHwNGG$9$^g5VEEWQ~wXC8Yq| zC!?c37)ztoRcWOG@H~gQ=_=<73mJ5jiuW)+E{!Ug}jV|`MOMJ12 zxUg1k^q)2>D~*Qu=OZ~UH|6jC_?5(v9!9@n$&@l&$RMJ}O|EIZ(Nbpwp+s6G{ivE5 zCNmIg8{gSi=5-Kd%OIBNq^4ABD>Izx&d(0=5{(1}!;oX_+tN)MeEOE#O3 z@nD4VR1XEdX47(2ZG*_C;}|kv*D@EZ>1ZmCb8(qsKB-Pk6=k)5nF>q3n3anve@vK4 zF+nD{N0|v;^nq&5i+)>~QS_W$JUo)(PF`jcIz3v;4$chPD-7b$s5N>jiR5;B#f^2P z8Y@*zTeXVhQk);R+8jIj_%m5dC&=4Vo2aw}NA>V>tFPyMDjAb}GOj-aL@=+}bV@GI zuVgP35PF+V0N1d+)c#x_bLaL&nd3~$@_d@n*439C#ljk9yE z{h+GiPClg)!DOx^(Z5l+r?LPgRnTQqn*Q;DV@{GV9}6LFqk8T1C@2 zdHV9DT%TV^ArVrQZ)FsBDHYpOskoItqVEHs9?rIzGQuu^Kdggl(_~On^3h8soHvN~ zMpuqAL8)O}dpjA4WBqP0mSiX(UF>}_Z78Xo#d+k%`=rty%l8)zdHN`?5}baVLkl2I zbvVEEa*MSkL)(M%oQ(KEry=gyR8~`Zfo;l9K6|d`5^Z*J9Vi)0#t|hz%a{u?_`9>U zMA8}AfBZyF-(N}w^Sr>DglfiQRIQeC;304i?-1IX%O4!z{k4({oMp7L$sZW#?1gq~ zJvc*&?-8sY8Jo0+n!;Ll8WjooxCZDq`f=SFNDA{$2{+n*K~vFNW@IcH)^7p+*yA1dgkFd#>B&7ohdMLNDH-_X&REwWpN*;{ zF`Zpe>XJ@dIH!~}onSxu`EJJfl*YS@wo3U4=tb7&8;Ho$ib)`3#kw8t8v)HcRc?oRZb&o!YWegf~2M=xHYMt-lY z^gQDSzvu^P1ptx$wRR7v28O>0-qV2V3#q0z_NCJ zdn_AOgY8MRE85g3!I_`%ki5JnI6FsRn#pUfCXH7U2+lfrCES(I1cFI7;LJy`^O!mf z@*VyroL_Y2qw>6Z94NX*mamZCZB1GVDgzfb{!_&014Q;m~y5LJD74N-L9X3 zz<2{JW2f`kly#Ojc};m|x-*Tz^veW0jbN80*lDIcb2VuUb~y%u8Mj@|*`~9ci8pDc z%(iljcb2gOVN*ZuDr3hJO#3FD_XMWf@h1O=)MN7Up8aI7M-#HXI{dldQE#K zj=_#2m@C2Dv#cp^*U8{4%XId~j$_yq=Pb)-g53te+?(L6%dUs;&^(*kH_w~K>wG4d zd;8gjANtJeras$X=XJuixVy$+-`^GNe4FkKa1F@tGl97_D-aT1e4VF2+}wKZ z!#foO(R4Hh(J~buKFS$KyKk-Tn1Tz+q(c=dEvU{JKt#}+A{i+CRzpG_oE0D_$auW& zQKi!@)mm3=G*McGOdvAnGL&@iA)vpM$~gcrLj&xzNmlDlWj_;9kFbXzKKF|$Sp`Ds zIhfK+0}>t}CMm^0ha71ToB`BxRYf}>f}7ouZOkfgq-I+l!r; zN($CW6)88G^3|7LNW0gQom@(&N*j%ZRXvbS3&`Z4(~sU@sLUKnteouRR5I%DpdkHv zUG2raJ1@(lbWq4iN}?ZEt+5nAT$3?2MxT!`CQ5ZtVuRj?$yj<{?aPxwRHc1ZMcmL!|87|!_RYEnXr+Z|?w1DfhQ$~aTW1%V)B|WKLOe5=s zTv~}P?g^@y9ULBrYuJ!!yDdkBgq#%P(j6~_JcRLlC53nZdvPH#^oz#tsX|CbD!n|P zU)7XQB;zYn$f_zVomBWhpvKm7mGC6znCiM-Ae{?y_qNhg0uyf&Wq@*x@itJ~c~pU< z^vxP`nhCijM(>-=mQ*V>sbUO2`t+GfU~wHz_VTxcC;A9X*71^QOq*;Zey3Q6%j=rZ zJ2O=@sp?k1x>1tv@uNezIlq)7+PJ);T}!V-yoHkMB4K5Mpm@(6pk z4FaE%S7g$X)i&?8R2}^Li?aOqlb4cBg(Ziwbo@f5n5-Ad^rKf(kJ}@oIimalwFAaE zp#;w9MM)V{G^$UAl?TK+Rcc9er_vdf6b&!ul8O2;ZnrXWjPc9L`+G9N3R!cfKXDIPQ`+=W+_9^DlFR2*zd%&yC8Yn@<`J?lYn`%wk#LHk< zqUk*5KaRA4tdNK2!)2wZ3`m}$l+=o24Sm=zu|z_iJUWo`w{K-XLR))Y83QMlz#FO< zQ|fC6>qfhaWYT?oQIjW+chugZ7w03TZ1FZ!{3l~JN6FveRL-!rG|!O0xsah`Ec!u7 zz68dd$|aR4gmi>XVNofHN%xoTFECuKQJ)60SI_u@>|Qn+5JsnvxQ?gHBi6z~{px z;%0NTd$~&nBJhXOrdK$dxW=^Im%!ObhFTLinZ$XPz#4{d7Iud-w9%H`d`i+7X99t^ zL}wVi-bkgMsmeXa-Wji#vXh8NrCbx=aw6SMPn{rfQK$yWv*4(Z(sPeC2u8g8t)dqdj{^HzT>L(9?pGAxw}-Vn9Om)K{2cEHNGz?g{O8BD;4SC zJUiLX%NT2g<47p2nZX!p*cbS!0Uq$jni0-G;3?L*uji0QX22o7e<&?q%*N#qXDZLU za%UpPCq?zT{q02q?|>-IIlo|%ar|IzdqX{YkM|2I;o1d`?PZfVe-Bm-(n8kMel`A|;fHNhltX2JkJ2e$p9G2x~w)tr_eA+TrW>r*cv0;=P>EIw;l5 zcf=fLHKkqYb-Il;&R~rxiAp<~UVcyDjY<2MFPN!_vo915Y{^&02Nd?o|D@2Pgq zvt_h!NhFuYp3Taz+g67noLhQL@AQEqm~T3q;<~P}hk}WuR2yAc;Jw#IU$~E&oxY~? z{EbDi*Cs=K?^4P%zq2d<^q>9biVK^-eA7MT8*baT-$Tng;jXgVzBLVeNWTqi%6nHG z+wvPQW$n28`t5{Gbr3eyaaX;Y>S15(ANdI;57P|TeYWS-1Ol(D$1b-C?EL25F84Q_ zh1i)0&dT|0Gl=Z`c3yM8DetB_31(7wHTO)j1Ht4m^_f6$=6AMl@;Jd+AHmLN?oEBB zk0zd16P$JN*_p@0+xbi$1H8BUzo{Mu#+$lK9)d|H+}D;fozJGc35>G?^BJO-!7k50 zV7viS#+kmUyvb|IJJX$M40hib>@>or@^)FqnX8>?keX@Gi4YEo5~q* z#+x$t^}{a1uqocI%iNoI<~7ge%3$hYV7`ac!(i9rtltEJU9X+j)M0`hN3i4VIMW}3 z$z$>{m~<289D~WndppiN6HJ`l?`?6cpI5t_c_utGj~&N0oNW=zz4O`JJKMRd-G@Be z;Cv=H%WmuMePgkMNwcp8?t9(@b{=Pb_RD7cQ5B9?#{Z##<7e0ecg_1B3hest3eG&g z{Mo+|I!fTPr3r8`kcE`GGrHeVWq9*J0bYvk-vWykOFf=KWv;Tv4fWjdKi zzF3fCDxnTD=m>(+Y%Ua_eJZNo3_!G#nR0x%BP)MQ87-9dNr2EBjOKEMv^FT2{TPT_ z5FnIB`pff%O3P6K1mET$aA^>Hp^Tjq5KGPRTzVkjDS<=PE*A&}dKFv*JW^|q^xa(R z4As#9jfztQWVRwBVlJoGEj2uzj`)?pCBrRB8+!G=jw|F9nPOe(p^{W|qIf9nc0&!> z``ouS+AgjuAY45@8uJg5?O`53(+u2t2Q>vLR)qwOZHF_or@rBl*sbhHemQ^-6b zQAmFePNQ-yD(s^C))l(p*%Y1gZA{PdO1 zeZ5C}cVQ4rRIwWA`cvYC&Q9p@lnm4f<{%3Kk&Kv}cOmXEB|{g|24VId#P&YM6G2^+ zjG@z!5Y}@B0*_Nn+k<4*(vW)yfu1lgn?uD#Iy#|h9hpUuWK7|w6hrxE%`ds;=zB_-d;tf7Ptomw2_qH=S2EdnC&qS}_? zF6~76G2V#m6ti+!sv)lcPhxUjs>^sh)AcHV7$?(%cFdAkgGIL~vwlZaR`-*)D)S-C zt$2JY8AHh=wmZRj6bz#u==V-M05a4qSB-&OmpgKZzPvsw%RUHXs%3g3v{SVbdMG7s z^|20_s83aM)5)-^BsRM=pbtV9byD5_x;fCjK&BmS*m1qd1ik@oKi^5nxKophQbXQd zR^`>RV=3m7Sl5v3WaE;;n6GOMRnH_YQB9IkVfxO&a~6A?4j0HA_6I_;yT32reD_8U zq9S_{N(cqyE!LLOX0-eHuH2O*)|t$iY|N*O8LIm8M+4(Th7LiR?SY&;+LdoF>WKHL zBO2O#q=#p05A|Feajj&4eQ<#~4}tr1loN>1iHcWM#>woes|q^$h4SClB< zY`-lxKQP@TF}EQC7#JsCKHs*9=`9Qi=qA) zQN#KAr$7FYdSvH$8jnSFZ;ff66>Hn>($NRk)T{Q==)E?I_2Pa#y{zC}FwphSV!vg{ z;NuS~skD?UHJOe_>I91G>T+|hqW>5ynZ0zfRBDgq5ys)6G#kd2$Y)e-l@i6YNE$&| z=A$|^nZ`V$LzuHG;HNT=)C2+M2WRUXYfEWKdSItiufE4IR@}(xyK|Wh2biCZj`{HT z7-t#ZZ(cdb#*{J2AF;^n6x~zq==m1{tbhl>&YKqtDfj zakn?Zej8w2eR}Sz-CFFA2+lm(r1axGM$g|plu?HGcr2fN@i(ObZ7|hpS zA!Rp#UG~0uoOw;y2KINX0cRce!CiSw+P3fLhXCu?*2Y8nXMlM(ebd|Zn|qVjrYp=` z@oMfF2+n&`&Mxl+Q-*;y0+kW?YWC`P$$t&3WE(Te2J>tNX##<1CYWct1EyYHO}d@m zq}joMU8ggj-M$T*>T~9?>*Lh~#@m75tj~Z+=hf8X%xC9e*fiIM$TY#!!>h?-rxWgK zi?A)-4)?WVm$&OMa9CJ`*vR*XWa(Ovx&2>ceU+&Hef$H(+Jzr zdGGAwraqf{``LhfPuP^lz@|9Dws?Ybym#f@1T1fG+=PFZ%s(4Ak7RtY&kqTNhs13P zoANp5ZW}oBluo}9w;zPUpeLZO)X_zl&Jpl1oGw7jxTQXvh#y2G)sw;juOvVyVz#9W zf`IB?fpADY{*qXsvw~)`B`FXEv}+eZeN=~|p>=vUB*V!KLY8)k=>5|JB4xP1{`UkV z>{&}b6;)z-vJ|;)k0cWdN-joKUXe&VtdcUUhbm(v&$z0T{EOn5-VS@yC5Vuqd~;fp zA_$AUTvQ3|gTtcSGzXe*OvVe+Rv-Y$?2CbjqQnY~iRaU3qYHuu1Xl-rzHW@9+MUVT z4}v9`#(ST3?xrdgc79VnJ_t~HXr-zk8Lw9$25H2fo;t~FS}hmqxiT9I2^GPJeW$jk&oD!6j*-6IsKoyOYfHu< z86UqnEi0pP<^{e07wGtdYV=_r=7t1o$gL`vbo9_|(|Jr^9v$WsUua+Js@9Vs+9NY} zCjtBe?s(AlK5(!C!h1d*$h+&RgrYHV13$@JNMpazfz3_1rsE}_EQvX%I{a`vQ7Is* z(A8^I3C?@6pQ7`ErJQ1o&Vjq1?Zw4|HdDai?=jDmz{P2$62)ZTCa_+QvthXgE|4Kn z1->2arO~X6m)6q!YT-D_0XcxGVQQR)(QgTymVqM+(qeY|B z({a;l@}t9oGBS8Z4F@BU*;wYoo_d~*;GCjE1dof}NqrbEnLk0H(;ognF+@53NRY#r z=mcks`FmIHNC9g-z!>r)0@jvJbm$4#hq7e)&3bjI)mu`lHRMmedL=u%8Ob3(zG@_sPU^mxJl-j0 z^jy2CclEurzh zJ_PLVvk!$ITGlRiU)gQnjN8gSv_3oh5ctsY&T*J;{SU2!;H<~cM+Qtj8%(<09?RVY zc3yLD+H$sG@)`ImMj%y#ZAO%-#94toI6I%+pdAP%%?<>Uepg@*Wh`Az92-Y#$Y=IkHAS>7&d`ew@7Y0h#4L*zTl*=ZkA&a}0uoHNaCi*W>#*I6Iq z>~w-jV?H~6Tfd!kIoq)7;k{iC!NlA3m_XQ82Lta3jAuS`Z?2|Z`LAOBnn&JUf2(AE%DZn3LW5{_vkxD%Nih{LEX$3t#9%}XM> z3SyEfxKt;kl*|-FMg_zW31h17(1Y%D348&;42)3%)dgaL4h~ZBsLTgr5Dz0Yf}Tjm z(AH2HNVDl&GJf;|L@S-5?50BU`ns*s0JH@dM}N8_de)3cvp13{hzqLIjs^pj;Gqia z=a2GoT^|VT{^c?$+27j*0YbuhrBZ|R4oW+Ai{(P`nT&+_gw7CfRt7?{b9^GzQUyeo zM~$0PGKEZEkGpkMblF2&()4qC=}LpQoC6g zN4?pRXGeQ-SV$>R$u&@CG8k(fgf4AojYdMIE^i889m;AU*~hrt0GN=XI%cZdF3L7Dqb?WwyPo4RyWA3{9uAAn-?$ z0Ks^6c`cn@PgN&hJw23s68$XZ)Vpo~#AC6LQKk;(ja);jpk9?b5=_LgKz`|i_$CfN z*-gs3#sK@qs}fK7FdeTDTSeOF2T)ED0lfP`nEMb*^+;uKBT$lax)c!0QQ#7AgANF= zrhwE5T3iqTjqdQ^yl@D)PzG1C=n$r{gM3#dyBylT=~t4b(oHJB0OhhvmA~ zlBdO(I@;)r7V;W>D78lNQseNce}vPbl4624=eNKUAZR( z%qgXPX$O?H+pc>vIoc~qsovHziRa7d`8Cql(wi*h$F#YJynLTCIwO^y z3dya#$R)-UOeUnh+rZ`ulU7voWEEWjYw42iIgQCSC0BKBdI42Wiuk%t11R=$W>d zPwBg1(P_x@ojBeFGnE?S+L96HM}P3P#d+_;c|B28WeiQ%8^e@*oOakem|L7(0k2#% zhQL*?+TaZ0jEn*Y#=f9RERzXHM;2ppoKOiRq3M9igSn(Sd>U)MUr39`y;i1h5aW1P z=_u2T5^VH>O9m2|ncfK{+DFpv_LMo7z`jhTGdNfA?!x@eCL_GJd{PG9Qni)#LAl=P zL{xEpcYjYRXQ$F{_hgLmS8;X}@SZ?smD{G2zR!ErADQ zaMD7dGKLZO{&WR`a)bSu!1{X8CZ9&wYCrBOnkyuc-Tf!^i$ zh4(ez_55)UGcD5r-q#~K7#Yd)7tiz<<_~Xl!o@RYHV6J{*9Mbr=eOf+_$$@m zPnMr(1T&amo(awY@R?xe-aNjG5XapraAzA{hP5GR87#MHBnP*cS1Uvm9?U;0P-Ii_w!A@r|@dRfY!7k4@ z)3=B8Z&R8nYp2;|7zj3zZ^|$bOgzC^&Mw0^Q_ke))h@$e%4{olUl|i;%9?odY|`xf z1e0dRo51`8&V#u(@eiqoz`S;T-fzpxtI2Dgoq6r@c0BJ1ro8F1osVGh*=0A?X~z** zpSd@Aob$4+4fD*r44dkA-aFf~uLR!Pb#HpMuLkUPHw9$d@}gHicq8Jqd{9}>*_=RYR+@Bh1hrIHe(UI!oaA)QNpkdw%mu9hm* z=LG>nX{#Wa4fxV8f$*VMQ4$za5D!%6e4LBO8RAL&QCcFA%d4F%s?3s54}-WU6mlvV z7z07TxuQo;65pJ$06xmQ{Q(Pu2=>U@OF|N9WSEhm2&$Hb)hRWW2)QK#BAk*xH?5(n zrc$MO2EvgHw{+C6l4j~j7I@JDp`8MeNWQS7+j#k7d&9N~c*9?_#FXCI<%x z7{fxc@upPWk9=wNvs8lOpJRDf{hFe_K(tW zw8`~dg>yvpXusNLq%ElV+NFekAx`y3k;~3hjj4NP6G0V99Iui8eWiz@YrS$lX)vBr zQdH#)<&ID<2pn4%H<_C<3e21u`-9k ziL?^_JR6F%9~BB=9)`-aBLjeT=q_$*l1wBdnaxP6amye{p>9eeReKYx??620Gl@ak z$D))bnL}ihx`0a~;3K8rC@JK}SSVpqYE4v)%RQYagE5ovOMAMK^VV1iyWgDGWG_tn zjZ~jw04@P1$V~a=SxX|xtV%+WX+mi$ob*z`cv|h2O2YYk0m-EkG6k(#ZTEyW^qRG* z>;Rt|oj&F!q*7BneY*XT&{pOe8(}${sx%;_U4yZxj4_w=oJ)r$B&Ip8Iz5ZVBSJOd z7{}Wjs``Bv{iQTY3}beM0uuGQ)hP*?D&JqWrB(;7qMpfUq^k8H5YElPM41dXy|H>* z4&p3IV66TSC3yt+GLv7N-!jjzsU(rfqusTfp5I{aEU~Y=@|(BUQpVV^ZRB`2`@8em zEx`~aQnShvn_f~p3osdz^l?yWDF8_X$P!{GE_14V-Or4*Kdw>CF6}!L%lx6TS%+t zUnB`tuPJ3T8!hAw_Rn!Kt&*CVL|7VwsjQ<}l|s&CvogY(C$WCty}iI#y1ExWdU7HW z#Ln+aEf}~mfI>x${$;Rc0xxC1fD@;_O!ZP z9W$A}WC&4;yO2vs8}rEX9J4L`Zck=-8w}PSS^2{%6}(HPG{!)Q;|kT&`!m^#`E=iK z54^4MM-uE?oF#PXKwMdSe3A~}T*dh5g}6POs8?v(3FNo~luE^z>%ij<&fFx<@~Z~D zyx!WQ9089PI4k?(rAo7AF_-%oD}j0yPj`|k9ofU2#*6!!P9`dU=;Ar} z=Ilzbxn?s_b_(>p-oGw?ANeoS7c~0q5BJm`atJo&zs~ zIMeB6mp1*#Af93z-(0pN7pH{0ThdtfU!2y|+yNPC{PBs5vmxH$Su)DszE@^+Dvfs) z&P;qoV*XtEV-6*($>5@-Kc$-aey)+h51fsmEN$`*@J(=pdF=tWC>7VonZ>a`O8YTS zD~U(^^7Um?qOl12?3W?-1=W{h=!?ta)qTnzTkdZmx^gJ&G)+>7rA+6u+0$QxlP~1Kcr0qcKL_YW9PNYZUSeT-FI{4x50;kU5B#`f-}xJXN3Fe zU>QTx+y%~h9x@(h8T;A5wmv%p;crL;vLJzpPNK{dFnR9EOEBp++*hX!c3v|vB+Lw$ zGA19d=ALPGu=Cl0VA6SY=HatRGgpRf%t1S!DQ{m*9uw>|1_MkpS7)D0yaC>CW0IOc zubT;Q@{93Fl9{{f^!{A zep3g*jyL5@ev{Y4n=*_en7U1Q(;mT;an|c>%hbU*b8qsoK9i5Y`}^W}wc9YkfHTgS z=B&%^E8(Geoa1pmn|yY}tnzHk1vhi`uI->dXNqt#R9P8c7>_)bFy0y{8Iq~5A9tvxlWRA`UUAeAzR4FaF)wENk(%#m+5AD12o>qc*; zjD!f5CyqXl0X4@MC}ris*qR{VPD?%6&qRfuPHAtB^R$0ZP)U>t#u>>KWeftcTy0`` zT`DP4rb^Xf0b+h7`E)`K3TgG`+Q9_V2}t$qRGrI^@yKuN%VOGA!P`$ z{VC=sONlCsC5rR_@Q$jcD-h$~l?Q6Kj6`uh6;hSUKr|vZ-H8Ok0qG7#dX}UQPE_hE z3c`<06o}ugb`SWq(mZq!Kw|&VUQT?0faI`d!|Ju{CIb>&&Xl=2>h~qMp2?dMi2rm( z@oYbzR>?W4N>c)kHrvM2sSL(5l?qz>!xB!WWjXGvbY2f>bh<-(g7lnwkcsJm~N(0vVIE&nJS|u?LVigF_lA4%nvK^qB2fHxreac=edU6q_8?mRo*lg9_U*h@+5@3hb}ZsX!iWHyu-DED_) zb;)AS3`RqFyqiVceyj=h*KjO!_(4y#R6AU(Jva;KZ8;`m;00}U#iPKJ#axN{i{?;{ zfy)idH>Io2Y6EG5Ade>^67t`E19)+OkjX^VOYVKz#_R%TikOsL;4_&_zDQU~&D(ul z>5kM>FYOJ|{$@1flLht)odzWLpGv(wQ06-&S7|S;TyIMg=Mi!J$?qgx$r$S5Ok4mb zn&paA8*SO&-;=YeiY$;Xn}{m&fjCTt8zpJ^V+p;PPB3O~Br1bmUwo2m*a zC4G0%uL0@^;cV(GL>)6w&6CoRl)|QD70(6Q!X#7uqCS)s#+1SwXG2WKUdQ~nF>W%< zY34wkD4;(HOyUrDk7HCBPH(aI>70SmU#Uz^rNc_Kj*fvgQGfmBLe)hvt=MaE$;3m- z^kE-9dG$!jm8L{g&6M81Ln>8ADM9|2qs%nqo4Nh6@cLziGn)2A`6CON^$na^v;ldX z#U2iMl`*#VdX&kT#<_u!;4E-s&$}do_Y2jyx&NnlkDTHx_O6%ext@J;W9&NzS(RSK zwiiE{bZDOpwj=bLW)8-^kzBXN^6W4#G3;|P)~Q-Qa#0#B1YBC{4;qW}}jf@Lr=@_P3?3jvvPgUxcVnRJxh(JC(l2naJ~<63cmPF4_QHAafGu z0G%F@35;b|mFTc*sgjuk;87Q4TEOYYdl}g)rgSdI$Q+`b0s8a4(UV8VyL#U8eX3?T zupiD#75zr>2YmABlLPb%?_6|^>g7X>lZ-E_OVb$#&4LVYX8A%9Iev63je1RX6Tm0L zP4G^?sP*L4PEy~kpaAq;Nv1QMR3)%b#4A76oTf&|yybbwI7*X-+-tRU7)yqgp^pJ5 zXqXYbSe2`STgM61^AbQr(>;;+nvfI)gQq~D}-iMaml;;mo_MvqUocZo6e_y?ZZrN0ai8C}2^WFs}zcZL} zHoa)Tnb!oiX}7njZRYzcMxgC1gu#F*$ScDpqQs=zuqm&JH+jwdraDcUo!3mH34AtS z=Qn9~UX#bbruqz+eCBHM@ycMQo8ZjDdpq6EV+Y0?*p$b_n|!?5^TqsjnhAD2yf^6t zBGR^WXL(*Xr4vkf27-wv*lBjU2_}A1{RF!#)9tc+w#%9_yxQd$OuWgnsjLakvL@b? zVcjkQGZDvFP1 z)WKiq+mpEz(-EO;#AE`(03X$rdIv;bR7&-xWKu~9N2B7x$2SemkNQ37c02O?<#Xg8 zsd01?6l{m~;>cK|M@LGU(c54;6O~}1AdPBO5@@^#0+-SoH4qgvJWtzlR1u9QWAd&{ zdt?#)Wq%9;ie4QFB*bL4L?DysUWl5zTPCx`EK~M|TJ=IQW%qQYi7X%)S$y4QdKN*n# zh^Z!sr}2tJAZ<0RRV|xdmPz>0K>{W2n*FiRa6g%5B@oN$oqZ*qX{;TEK>X84yhyX% zRfgpA!yUEpbx_EtQ-^peD~-~n9Ho8A+{}SczU-o1%vBbIeipbA2jR=Us2byPrZy+( za3j03!^0kQo?Frw^AN;CG6}|wl9Z}7>OU zQfYPN@zcjr@7x-qr>gt`){(ZVsLrZRH-NJo|H6eeLVcgSd?Br7L&8{JG6g6x$NhFv zNCI=0z^SNo21B`MPn7vc=Mz-NCi8&OZ?qFOM}PX$wS05Ylw2YtbjGj)0-F+ixqL=m zU$-O>&&d>RQaYyI?qR>><*GzUu)feqz{&oO;uuvziTA|KfAbf=6!&~2t8PnnQXy62 zrnKTgG9**%WA9=jZ*S`I{KX4dAs_7rx;&Kb0pSlk!a)tP+Kv6!m%##YE3bMNr&JE@ z10H5$dRCCJd)>krkfGGBTSAz(8rF+WYse5N#4uMFBZ>bN=I{{nO-Z|}=2)5Nw3$h@ z%-u{x9nkbudTA=VsR-6~B(a@Cl_cu6+R79ok$+X9x92IkxRO*Np%T7i+%>QlPL2+x zb8{(=vH@k7?_unVVNX0uGIZzi{M8Eql3}hQl1=dk0>9e1;~vJTrRtWH26W+UA)`#@ z6ZO8%9}*}fM#)E>nR{3(npq%Ij||KinJ(BTJX`uRIvrVH?0y|LC8X-3g?xM2QZMEM z>)^dP6^}|V zQpNaLF(DY5Ntb0P4#>8Wu!433{-mTFc^>|J@qe-0IWRy{wlV%G_^{%9G zR>%1x2+{)>KRr0JV*a2&r&fO8Et&Q_uicn`N>*Oh28uI>C;Py2QG0h&;94E$5<|P! zMHMbRhcg%-)or7(sN`{;(@7SlP|ve;DxrC1I5$-i9($?N>FYk7xctD^kPHX>Ap?6I z_|9{4i2n1(s%QBG`sGq4X9(~9N_(WL=eKr;vA2PnMT|%71!6xmFeg;grKyW-g!>!c z*uZHQ-aoV>oDaICy`W7)e7~ZtLOdjE?AsP_nQ4b(nYqCa+01^%6{8#+he=sn>4Hq%n@^ zcD%_);MLS=$8F2!tk1;R`3%@`b{+!noo$*tCTwcY$kH20eV z!CVQO>Nl_{{-JsAs@Dc*e+irJ?+R>-^Js!C{l~Pw?Z7d7h@HT{4e+a9{z7^nPDm`$ z?pQqNk-bbvPH#Fg1Tjitky0;MT~!~%OHgeRQLPWFrpzZw7tqsdXS|d$2zWA_l9{YB z13)_fiIyPRs5o+7~;TLO)+uQ3iww zC2R_0Lil{r1Mx*qn6w*58*h|cxu|s{9Scbsgig%21`*wtUq=oTy}CX5V#(7aDdg#hejX(0RQw!L_t(lhazA0 z^g29WEkFRzRf>Z|X=eh09;2Zo9HoNNz=IZu@#7aCfdKS@sJ^vnM@dpuSw@{CbW?G9 zM2(_99!aHW=P)4CPD{MYsl2-^sU0xd$8x(?!0|bVO;P6uROOvxoI%Vx)dWf4FZvx2 z=0ll|r}Cp8|411ku`q~N%nKPVv}HvbU9`Ox#9C9eIEZ*}I3~wW9?7WPP)06QX}#Dx zZ%RGc%f)3k5s(b(r>({BOD%1i_Q3>ugL{k;OS|Z2XE;}zb#F^uWjrSH`-)>O;DHzO zG@h?8cHn!nqv`o<3VR;JFZLU~rsj)9`SsVol~iCRFZUD5I9mfRzPoHl2)Mro+;d}J zat{xeYdOwEl{rsuvlo??bzmfHztrA^yXu~=3@%25!d5klBKIluW)ssRlqvOhFk}5?`={7P0@%j^*PoRxd zPXO~4ibw(YRBN>4C>z5(($oZF^a`CNX#^cQQHpdT@;Pi-)fxi5_KWUfEPP^Fzr{;Ns@XCb~T zfG=G4L_7}Mo=GvEmI%)KUin%M3UPUR-H;RX)gw4Jrz4qToT)r;8spo`rPMQi0pq6q zK}up$#g=NklrSx04BSIUj~~lo)Rq*^^x0w|d~MQv#YrCfI1^V%HaZKMBG3c)6dMCy zKZ;w2sWA3+5a-KMhSQa*;_f8_7{gr885i(A6pP3y_BT~;FIz+17Xh42o*3=6;_L$6 zk%_v*!O+9LWZyaNd^#oj#f-i)vgxqSW$C&klYU>^lb(2SM$nwWyHZ`xOEP>{z$^BS zKNit>j7qR$4p?@Cam9FUVn0vtPI;7z$lF>M-+~^YvmZ(r9|6z3Zk)+D>)v7ADYZxS zb~4rYzQ?YWd=&c_ILP;XwKvyq3NO}=QmZo{A-zU7`6C$SXad|PbCe80{`koKHbLK# zdnan|lG3!?%N?9?H`Ruo)1=$^LlqgmDeRB=XvEo;7I3wQ`Q|%^lByA$scOQ4V@BTs ziIn`KfAUX}^RK~tqu$3Dw7+XV6nWRjH%YoG%!V9zNn}*XguM=_ao-TGZJD%22h5sz_v{@#DRP4{|q% z>`?Gls)-&lGrN0I2jNMADM+Rs2>R#8dHMFumD=P{2{8}=pl8*%dl+@ybVq6*@Y%~( zQmfb1X+gC;Ksz8lK#)$3}DkoF2`XHY;y9_{AjU;p{f@!D z88aet5PNSL1NrikXCSZ#l8m5z^yjx{C6yGRY7~hgQY~%}W-lHUKwwAY^8B6Jp1Ns| z)v!JtiPU>Tp?#*~OjO79x_N8YaCdhHV{U;!^2k9xA@rhHsx>fI%Uhy29hdfCEZI~{ zmLSTG5BBBe^0f>>pp)^0Wl}~krOpN*xap{a>VGBR$EPp$&<5ra^-!&f_TxI;p-Ma* zBqQRcs^fC4YsUSp(wSJ3KlyuqU;Y*5m(q%4B+$4!Ri%k%R4wJ?&;u_eh3LigN1uNp zU;p{PmI>ybwyKVjA^FW!O9{xMd{Sl@adKaZYcMiU%&Yt}8tSx35km0fL)OT5u|29WY<*kxDMnM%zaRNkKI#m2*?= zDg*ji0b>RJH%AkUDI}M*jxsr;VH)!H$Xn$5@sGcho9i3C=u~Bml13y}xqrw|AoFsD z^(taKRGB|}{Z3-oPs)VH{L;=P?FSyFLaIJJnocE^&&ug}RlVSjFu%nZJ+Ka?GMLG$ zS072U)4{m0KS1z$ygn&`Fveif2baz{*Z@U>m0GURdYh`GIaL>d7 zs{T%ue@gb9UsUAzLFV?X2Ch@GmiD?j*dJtmSBI2_8q3k)fl9N{(GZF3@7`Zx4|{=U zqUywy%;M2VZ@hs}Os?L1k9eP|i&FZKPJ(DZ?x&A(%8cWg^G&(0by13n5@~M4htNMt z7S6Dr*!ClgrQPn}nNEiMx|ZLb)zm2hrdx5E>h5GnjHW9IV~=*PF2oBw;MqY>xHLJy zbrO`JYVrhYOS_Boa828lSCy_Z-02yZQiZey`Q)QdC_K3k!X8^K7f(ETm(YC;6yMflurM8O&Wu5MmA}jg}7KymhT~ z&rFe*lDJeOr7cx5Lb-RiM+^MXWO*x%no356o?|boEtI`w?i>_yD#6J0r@hu}IxW}l zzsER(GRJ(-?j{*b-1&2?*LOEf`Sc(UJY7l$?GlfvT7PhKDD%lgCEfb{zDk{{^AGH8 z;uoDP(f%mkpC3Ixk;`}Qm1!TxTJnb>O0&7~E;^*QVdUX^>Gd_ewc|aDF;hYrhoA0& zAkMQf`W(RiC8LY`;p4-MG9brf4kjY%5u9qlYxJCBqdiKM{;szb7b!UzLZ9daWHFnl z+9QDaCO^vu!8j<#R zDOoxP4)Kie0DtLq`m>{yIxE>JB=iTC&J^Dqc+c>xA`>=}&Z^XRI26(M5yyN}CC=ZP z;-Fa%n)*1H5q=Swc{C_b(r)It;57IpXrB5xAQs6^O@tb%MeUHJ21}fCj-m!O4t@h*wn6F7w?^M zd^Y*b)mgV)FX65{COF$M`Rrf=pY3*jNV*f8d3iO#e!j1-HaMT}f`{a_^Vs8a0)KsH z`hU!@X^#Ik!_WWxUx8@#OP8uclci)b@!K)1Zf(RB;{i3YU&KfFo9ng`ZyXVAZ;|-o zhx80%q~u08yqTsDg8+2J1-IrOU8fuYkMXUl8f2^@gVv^NRT;* z(@`bfuCA`dwU|jfmBNSpQmAG*n@vF+xRi*c6wPQfl4`A?5iE9p4trak$DPYiYjg-B2%#d zh>d_uL3AWRu#-VHTCY?Za5WmLqk+#p|4hP4cw_A0fJ7q^5HJI*hX=INT*@F+yX_9f z;*}Z3^~XQ?LN4B)tF#jdb~^d^uGEoaVF&xjjr9mgqurBYHl=p&$dqk%`Z@<>e$v={ zEEbX^=K1@#7xKIqmR_qWE)c$yp2%X3&Z|8MgHXm-3;M8DNfLS_Wm!s|l!TsnV(lrc~ZuR^^M29;pN#nZ37+1DpZCJ2F8@ z?2@VY{hKpM=kpSXr)AJ;Vo5;!VXU;BM|sBAS8bsuSUo$!Y4yfQ9On5=b+32VHMPY? zJBi0T8MR48wOP*V9-gPeuK0m1$pA(PysmY|x+lm4B4HW~`mjzu5a~XZM5F}Q`*K%a zKFVXvL9B&G9oNvSHVMog`dlo=fjcV@wJT+;QPOHPoyc4C<=LYHm3*ZdE>-8*7pmcr zaeyh3Qn`h;15()Ek<{*yygs{@!%Rfg)YjNMWLjL-hm!ESlz}n>F?@+W?;byv#t?*e z5PR#oEc7sYdefBtaHtZHbZSC%e(qq}%?d@LvY2$l?_Nmh;z|wv(|c_+7L*tn8y>F` z#8fGz69_U5V<6n~nV2$V$QUknhO(cIYQJdTb1+}1N-iB@2=>wlZQsXopGF(8q)026E6C#YR?`?0_WRUD{%+JGi=KL zkGlW*vF*$9J)sePd%wd+9Q*VBmzkASm38}?Za@uxKueewuRQU<6HW+0!g!0nx~_h3q)9?sr@DXmRw%bV*~+PY)SlVe*eBy2|eb8-bz#h5 zo}gIBTYG=U=Eg0nI3viM;q^lGf3&5uQ4MA^zRqxB_0grzjgAyI{eVPhyFaq3aQ~vy za_Q%0yJKJcxG1+%N5&x_>LVM9NLz~hh05B zXgsg$yt}@%s?Lln&1pH9Fk-j_g za}PUu;d%UUbJ-b0d9BBTd)s#U{D}>kb&Y$*)!nPw+bcTfX6LVMUwf&qb1N_W!$A>F zO27}EZEKjM=yj~D`FVPHYM*}gv7grqI%{c%_3rn&H_u6}b*t5}iP}ICdm)#%M!ltd zHt)|oII*bwK05B&r`ttmn)AGwO{Ux~A*!-^tJYb#==%%r<1h*_`+$v2RFBu!*BxI` z=ST7`nM&KS_M1QRbp9a)$g_lJf!^9JuRgR+Pwd&wzI~{5Mrs;6gl+ZXQ2XRFooQ9I zajpI(wC|8IZ`Dq<#zPwmuaPb;SF4)0E4#0=Q^QnwRFp?VJFyXK%o7LI2ys>Eq z$2D8k8eb^QnZG)tu$Q}2b`uUfY zP5A&XD<7TPD8%EY{U)%!w?W7g4Yc<%AWyhbcQ||E<-+e!Z~Q)9EoVltBu_{S!2O%F6YfJAA*6*6EeqV%hiT=b^#_QihqP!}%7id2JsJS!nY55Ul>PfG z7t%tRczh@m>I(Tn8REikAmk5elncK@p3p}49nwO4G=FG2UJvc{?{9!;T(n&H9j!OS zN5ix-xBUj~wPGLqLkC_` z2O`qH{`D{P+IwxSPR~mDl!*B&x4Trp23cC{;xuX@zw^ zamEccvLN_2%V}H46kJ6N<}Q*2sM+@VLrc$Hxr%K@#85^r=6K+&_s?7%c4>azr3{zU zR#k)pUPp0)uyyyYh+Cw2t_^Rt>ZD7^xhkNDTa27P+c^?Zy(l_!!SW)0FtER%JO?KY zCvdULMjc4SLH)G2TC#er zZFthva=U~9#Nver3nc$0B6d0um#EH7&a9A2xp(5m=tfd1D}odCYJ!l(Rz>i^^lCRw z?3*XMcGB$H2OoXt=^6EReYt40W?RJg>~9Ik3!hhP8!n_Xwz9TvGpVc-_^Wug6@iH) z)U*9l?;mQ($g5%mP?i|6i#8U~e~hiMWWow5&9~MDX8~V7 zKe7Aw*R76iw`@uT>4HmzV7Cl=aY%fmv}Swtf#b`f+Fo6~VaUKBdw$RqF=m!eEIH#5 zHNKS6U|`Oi4Q&75#0j{6^0QB!0ES6{(~^^B&%IsF%rClnVN>nHYIqM7%93CLOf|MO+%GOHWB_d&HuCHY6;e-3uI@q_F5nhciZBAoY5OIsQ zW<1}X&(7QY(wrSPZd3pZrIZ`1KNrQwNrhdhv);fxPj3ky0HK@P^vjnDwtpmoU-*$m zby0*ml4RFfztwzN>)fqCJMtg4^8*q9J zNM+Ji$mi_n;J_YkWL>2*uQ^7Q`f6#>-g{?50J}g$zw_Sr`9qR0nNCyYOZOscB*j6cNJ9`IKsuZlaQgCM#C7nmu z3`5fBOlQW5_U)N|qpG`C>sbY9Tdhm6lyxaE96Hq7DyKbgt@@Gpo!5S0Z#EA0+#$h9 zyRA7Yxb&Hx=2p?Xz&xpU`ohagukWPRv7_S?8(wO^m#g+b>-p<%AK6wh?M!s+dcxpE zwNl5Xt!N)Nv_?;bdpO*|YdGGl*~^$*c)DM+{$S|)vZS>xYaB=?Rw@;H|GoRxJlWS7 zGPI%2qqNS;tgFiC3~6ZSNZ)$RumR-CzpWMT$po5lc>B%}RFKuWtkLK0T^ zGicc*`$=bZadp!rH_s$PsNloJx}!P!4w61s<^zYeqQ??Ule{-@=Nxcr^hbUi0xIkv#A3R8;(2| z^j2d#yL&c!*0;jqoO|rerxq=%`kKRYyVCRP=}F(--7Z^Ma}R@TwUTo?sr~-QTD_4o z;;!cPeyQgtA9?1^dV03>{rT|Td+!Pd&$Q=EXS|+)!dGni(FZ)w^Zc7!&AS7R2lqE^ zDPPw9uG{@8wla~vyS6>eJ!f?}IcM`Tm+npZ`N@qMFw%C|(FJExrK<2Q@9T_72c$u< zE!fr>!25?Yz2|kNX$*J<-`-rceT{wod|+igZ?=WQc$wzedmubo(K8Q;a_sRg=*%8# zuIf0c$tN_nb3KPU_E{Tt#v}r80cXThN@a&K#0l@eI$r<3tA) z>y^zd>()(Hk1at|x}TijEnkSIx09UCk3}K=&HKizOH{6IY}l#J z=FHNp-WxCvFj0T{Iy>iu_w&y9zC2SuRhH)=3}bL_Ew||Vj{StqRbD%tI?^8`KCg7{ z_4QoiIU*{^KL6scGXkR!e|Mb*oa2Eh$a9F_KzOHrQ+S;=Uj}bdHkvP#d)>0Y@4I~T z3QVi(wzv?c0c!z-wV4LdI^uOvF8Vt_h>MmX+}2J=4-kIG`}aFWAQFM`OaK`}00Odw z0K_}N?I?ZodORQ3a3AtT^H1v^5Y0C&Pbd#?PkcOIw2qKJj5G8rp669< zv616*1w`|3AI)Q5S0H*1Oe=F+9U;8V?*Q@NKs0VzTLGq(4e+wG_#8z8FfBeFLOvkc$Cm-^ zvS#G}w-p#?uoL*-`EUQX>}2P$J^TJE`{2_bdEBcY%-`QeU~Xalb-P^=9yfNS9)I&2 zCwQ*UMPRAldA)ESHM%ZU*J=-KdA;I<1S*{v`aWq6?1Sy%jjEeoxR075M)k6dJtufn z!W?HPGSbiH8{xfT#jO zOkNM#wtL*Lwe>Y;5J4ya7x1EO?kVb3`5k*BLt`uJoVW!U6`|mz* ziHJ$Rt9rX?d&zA(q0)x)iJ=GvHS3ZHs5zgBIET2~Z;9Z?2A9S;5z#_Fi_0b3J8HOh z&$V*Wa=OllAV#WVMMTTaX~!-#mK_l_EBTb2YrfyvUbaKU!&pEMss1o*cK` z<{GMtZl^E3Xfy4)>TWp03wwH1;SNk07<$aNtMLl&kUks>r!Hpa-Ai*KmD2boPJqAI zKXRs9e>`ypUQYEEv)Il%v+C-qJ%9S#85QR+fERDn+h-RRteTj$p>XL%4aOh1fZeycGe{IX5TfEX< zQ(sy-gYw#YFxn@o!zG*Nb+#a#q&o6CH|AzBD=_2C1SEd170=$^JMGzr_g6L6YnR|H zX#4$ zDSB{lB-~5cnbtE^s9LWBGcj!&!U;V|-P`iY1}duvt)gmv;kb&uQ$8XvmYi^JrIgn* zRs9zZV*~Kng4XIdA|1f*auHAgw&ua?^--IugB zczCA0NBd2euuSV5xwBdIXUV~FM|&&dp6O9jZ=34{?bm_fp%~^i z=R97wv0vNijfKyqF^}xoQQPis;5{3Ae8LIg%ZZ+UtL3cDOWqB&CR)Rx&e_DcW21i0 zO%Uv94L0xGv9s~e)+!~(=Nqs1S9*>o?6lsp!=qC>6Sk)dW#M*F`&Va=o_p9iY-k_y zynT!m`kdKvC5M=*6^ltbs1ICDex4Rg*VU6GK)j_5Z#s#DJ+KA^Z%xz+$1gPKNb zkI$W%jC3I9+MM<>%vnA{POh}BdfpAyKi-eX$8#8|+UvO``>+3p|4q&5>p}EA>ox!v zc?aXY>q5^2?g7exw{HrsYA+7ayl+}I3Zd-F%D-(|fN3;C_|28@I&{UfI+*KeG){;M zYwfshujgAmOh>WtFkT*V_Xr192 z?#UN^b5Gfj25>(uF0>sWv>mN4#R!Ej>P_c!)zh zF8cdb?Zx4?xOjM3Kci({1#g}VE&;p!wYB>-v8ut`JLROsD7mRkQPMpWbtxj{r*7t`|ed22GLy+ zXQv{-k@yj9BABs~2z>WUtA800P#eo-J2^VCw1|tu)yO54IwG=`t9cRjV~i?UA+u0!fdq9|PwY;lAUnm{PDx}4H44UtPh*H!&vm&lr^%EPnTef@J zvLFBCOSgLlQBy6I>`=rqM*UL@=0xV9h|z)8tfaPK%HCZq+vIxI%GJ`13g38aPhK3_ zor>mI>rp7B?d$!v+qA+iR!UTVaLtBee`hEHdhL4a!U#?j!rvnlM!h&JWS&p zVWpIHNzr!g)CR4(J>EUG;>xP4AZGIgTPbF2xs($T+!0}YroNq9uRn5Wr)I0`YtH$$ zqVWHfQ>Y}u;m)Ngd!M4Xm&+FzBuVw zRY+6RUci9?w&4nuf<4` zR6pvyFeYJoAw5$};7N1dE(R@Y)KBf3=Lh!Q!v|V7;i?FB7#iR-l62a3&VWZ<{6uSy zlqk%|TP zoW?Y`ymB@4uJ$X=KaK}CYTu~f;e-Uwqp3;H_G(Rg=e-XsBfP*t#@0$jZOm%F^n4AG z=0VyIwR)T^zyQTI+vU})&Yx>{=yGHGZPs#`q)U|vtMnY1aW%$gPoCNQ`N*o7g!dgr zKekEPqcFVj;LBcP-4_Fua>1PS>ICH+=th@cTqtm8+@ZkrxEc^gh@IZ{SAQ=CA#7L1Y%@ ztqLBbmRubk97kmzXBIHoVB#S)m(f0-^jdZ*9Nky==_e0t5!;k$B;n5N{wAKa8_GRn ztya%k8V}xVuNKp`q`KzP1zWh#S^wVq?kECPb)IGWCoNa?n$Ny9E-3jEUfomaURyGNF|o>;x!a#e8{zAJi8!1&*) z7JP4k-@Sg{8rt7uoz>WIol9oy-4EZlT^Pc%>XV+A*qPmW??c-=(AmhdtCI6I$1W?< zrI;GvY~-1VlO7xpmGq3@qtD67somMovq0x@1}Qk<$%3AXh|=|XXL{}~xKw9edzO!N zMb5?c(BB1`9qk*PK}pTomBt3stfJ@1p~ii8vtk|X586(upQ!!Mj(VW zPsi-RitrnWU)~$|ki=Y0v~GCFHjTMhS+QQLX?OGm=(VF+MJ2n;HnZe{&KnGAM((2;NvIGgff`A(3STQ&Q_#KajwGq z1B_T0hS-Aq^z$#2{^szy?{d872HG;fo4y0a-<97KURE~#em)IuEBh)4whkT)4LP!e%2;&d=qy37{O|)Ey zkM?I;o6+=X<+u`}WkUXFIr*9AP6XN3WA%C=f zegh$%xOg1_qV0t`fRHC#Z>u-Ng?fPaJVx6GZi@qmif9!CZP7#LN7Bged&S|BwH(9q)Z>`_CWS{kxm~RUR8{NYRYOB2+qE`~1g$^xNEj z`w*Ca5X(XGZ(6?tpdQQ%^FS}z7&FIl2Oe4rdim}SCMNRTnFrl=-|F3o&5PJei?BjH z4rUq>SUII<(~Hgk!4?pV6g^BWCE@@^Q&EI4UOO{$I0#Tb)CRVau-n!?yK<>12$y7<-GIVJY)P}JeNEi&UW47P~l6H)rAE-v|pER{D zYj!!iXyZZ8y;Q>3!&%2pqiE~ zMi*|(9aZV$xFY zXJ+lNKCo+2eOui1C^pt^rI2(d4NufQ(tS7?fRRAGs9xbAxtNAg zfSUM>t(KGSMB)JTt^AVZtIN)WTvpy$tr<=jAofu0!lN(5`TkMcp6xfSA_8_G!nIOJ z+w-HA6Z)PQ z>W9n|`B4=__Vif9Fdnh2-L^D7=J`zPC5*PA)&&*wUgN|T#y$I9ZGH0T=bFo# z@fGtqwR@v-U&=1}K09r7ooSX+d*A{pxp?%Ui1%3P^5d$~oItJWh0A{K7~TtX-i`}_m2vdazW>!@(JhjI`cL%?keyc_Q8!0owBG9ZzUDcO-Me<{#?C3~_0M*X+%X1f)u@BhePwvk)1toA>Qm?NCBsPA_)7Np3^rJPHOU8#e>W3Ln-=*d0t+QEQE~C3_l%D-v5rI`8s2TVX!0 z==as2YqfgQPV061;~#%699gu2=9B)TE{-HO&ONZT*bz>4`$L_dW zx4q6A+m0z)(!TW%T5A>Um%JV99$0?v((yZ`vz!k~TUr;KNFh0T)YeXbap$V7^Zw!L z#YxBQZ_OjOxW8$whQfJ?Brg~Em?Ja z-TJ+b+DqD+=J?TzBbT)2$+S`}IBuezt0L;Z&Y5i1_MSbnk2Z47L>mo8ng>1CHIaCE z&tZ;GWq3~UJkM&M)w_K^4;JUfF;Ybf&f5tBBxq@^aW)QI9_x{6e|A@u=0Ju@nSype|IF>+!HSGh=Jw9q?Gb#UYIl%GK`I)aZdHZKbJug~c8;Wz0^ zARZsuyDk5#AX@HC>i8k;hBDEzuc{}WH-wh~^9g?^N>7D*(gJWF0ub^M!fzm?a}99; z_#HxMgDdMA(x*YR96*`SPJrJr0zbX_)FYx9xF@`dX%_N^v}nEn(frYTA%r|pi02Cs z@^K|TlDhx+Y0&O zW#a9G_;@=&ye{$+LVPG6>Wb!%hG_l}$35+GAL@wajmHD=IshIV(S8u7l@ImC%g6J+ ztY7hb@%jkU%Ese>cwDGIg!q^U{H^2IGjpN!SvB1o; z$=Jtradu-5>6hQ_*q0x@XZPQ~aq#uG1=adWako=5mB^X@7o$u3z`F% zK{zMCcHZLUnG-7qBD|5zQaeX%K@D!$=tJh=?9TWN4OA-BH&( z&!Anm!{dfsiGY|_953{s5KO~tHsy>Vm}+>lh3K72r0rygG+f07!@k|CX5GdgcD68< zjuCoIo->oiXJ_{9Vao}cq0+M=G$D#m4=p3@lR{nh%6dw>zglo6#MJ<`sFWpgX%XD# zA_(W5VTgyvhuA&TG~p$(A_8Vl1Tw@q`I90%-dWGP$K`^E*!|PC8-vg4eleZ1X0xNV zk&L>u@1MPJrU*pOKmO4N?l1+FWtc=T=vaH~A)-p#77@LFaAbu_)%sWS*6sDInoU?) zp*Fm9LJzg)tcY5OIhaLz18sSw68f^LIUg3+9D=VovUl@D}{{DBMuxo z7b5i6O159?+ro_SQDeSTKOnf0T7&KEg0)oU$#Kt_q(A;>-I+1iw*p&HgM+~(tYew& zpesT>Q+BDhv+=}+st*;^@1O37upQW}-reqPthzK8k}*h~qKbyCG?>)b!y8@BSY_*; zJ7Sno8iw#&gEQMl?Ont_cIQxKA6=OJ`J;p1s&Jd*8taYY0_;%oo|u@$Yx0%j1C9(% zL@?seBB?!r%2`YEhBFR4P$zUIu(k!^0V>5fo_Vs@vQl32uC}+e<~Tb*O|B+9K&lo` zpUaiB*6q^Q5f90DOT`g_j$IM26Yb4eSNmprV;hYV6ec)(l`@_F*w)Kgn@^}u=R@06 zUy+)FX@_mHlitMc6qbxxzR-BOnzOSR-huJpd1Ji4nw{6$Uf7*-(iSy8s0AMUmQgg; zIakePtdQ24EF|pde%%%{|9F-KPjK3T(}Jz^qRyg`9qAnSey?F)ez0vz!m+g0WKX!= zJ!d@U?u{EqEqrj`qd`wNTRS|k%R$S&dU|BlYRM+obGD@O1BP-wpRrE2ulzS^pD+P1 zAuv|CYt1>*JQstmWiEQ|MVbBoU2SL=I-A~KPTHI%4yjjc!cDF)cYq@p#*VGHIV-^s zn!U98@Jje}X{A!$>a~VFJ80U+_o`a!w9RL;_I$7AP6j4AYcCcPE`@|gWbg+Gz(zyo zo5tGg^lVLM3|^WOFvN9^H73{Y@frz182d0r*R+qC^_tGdvD?esy8qBFC&DA7Ldym1 zvx4m$oe2LIT>=p17=RQZ%oWb-vih1zr>!kqzZi|Ip*^};O1b%fCG`&mWlif^fmx^p zZ|Quh3h#QOGh1^h$8+uFb33lzs5rwE#BL%|*~voI9%~MeqGNCHY(ss1J-_7AtJqs> zYrnqG9$u{^-LXnSWl=S)E*A{Dg6TP}m-fo8&RG~Ri1IQjj4;#aH!|exl05;-9ORu9!Wtxk9FQ44avDU)-!Z{rDV0;eVYt> z&eZ1FmQY2UVVBw;d^}@}Dq`I+48Dm=$sO0){;{E>xlZcYbglV;aX%3b@cgf7Jnw2< zF*5)I7}E^=?Y5gQ z`1IrVb&lv+?|U1YhBLmeary$zA?eK-cyL_TR=KfzJ5;+37>1fHoE8-eCEquk1u!W2 zfKg1&`Sa#dI1Xc-Gm-;NM>Im8F73z3$+~Cst^q?enNB&gkTWTzwfGPIYyY9|uK?j) z>1`qUzV*7mn0Ve2qVL16TgRKW2ZSY@$fs<;E&Ef`fHsE9SIGDPKN-5JRt;llYCK_mM@wo zUSGI|wxS`LhY%p710hccKu80k_1u;Ri00uwv=KtIe8>xgbRe21njWt4HbQ&|(X!Lp zh^EKWfN1@M5Fhfy+mEJ4%Mn7Ekca#s#M9$t0S+kALVm75C2OUGe&}z%?pIQA)Y`Sz&$|v%lZ*5 zAM#Gi7vg{r2Sm#QxAi}yhq&+?h{tgaeTml}t^oJ(a?|4Czkz7I(f)?;vO0iQ{f^(0 z9&I!JJLC%xtuGoMU|QTXcv-$^{qb;Hd_07F0iySR8$kURdKvtO2LFry=znVU{qO9X z-~7TJ+*!B7TGJgtq*G~2=mj6f%lhiNd!5aQ*xEg;+m?tRcE?Ab|KxY``TGj&!>Hun z+s@f;_8dJZ+w3s=oULJ)gVje1)|tcW2IVTokQ z+9Ck-{%v}b7XdJ1brFUTED$8vhq9RkmuSIoJH!hH$gzEet+AAn$uprzv5FUv{Qfq=VlW zWjk9)+m*)c3@H(7NM|8|=XEbEx?y!3CG6LSZd5-dq7&oe%nfo}ni!{-n{d6U}#{)v>bX40}yT4&niKb*1XIjle(bb-^^*5jYoQOP_oYx|@pYEMltAic5o_nHRsg|4pfXXP$lGQ@qRo5XH8{NKp zu*9|)OqSDH!)8?kPEZs|#CO&b#zXRycXs7&!9+NkeuU_9Rii zUQW!o4ZqR(wSOS^^xdl6Tghu~=iOG>zj=CU=fYFe$#o3ae&@^<3RP!j!+2->oDGkk z?^~zavqiP{$vfNrq2Zv`QM!;uIF7?281C5JJ6}jya(Ufq$0yo@*uK;r=$+XM^^ts= z8S?YdV8*^X?AUVQMg<$`Nf-sCBn*ssd#3p=3kS44Ts6F<_P&04x^B&Cwoon2w#fAr?rakT5E8w`8n2{fKM=$V1nSR;NtwsnMXKY zSX$DVroD_K3Y>M|SsB$zf0q%;rG@vLeVi?PBtW7JTaX`r@{x6Fr+%gl)$yJ-a9ewu z^RwSSv&E%3ms)+Uy;l_8^Fal>b*1#2+eBPeJ|yLEm{ilge6RvDY@jn_|5~|VYSx*UFvN@63#TVFn;B^>VbbXg zZ=7Aa7vj|nXQ?`Tb*Zy%)}4^RfORjzI+u|2<=H?Vz;T%V&vZ8MG3X3+c;TT6TXDJU z&V#(K%2SxTwkxd@{b4MNTK5aJ`~0}8y_a;SRD2-uk8)ZU7_V1aW0>nOBbW7#0A5{= zdOC}1&JZ76&s()x);caZp0BS~wYRmGHLrMm$6N<<#`8auNm&s|O07Xkdwp))wS$wU zkBPJC-f~K7cBW^7p0OO_+K)QwUAmqRL?z)oQkZ-UK`QZ3WnczxlvCDf_M8ETO~@;~ z+stXNpgzk!gvrK{hi7Ttdph($|h0pMCkBKYz0+Jc}>cn)-HF@2JnH&thNo%65-x!nuKeR4fW7S`D3ri&{P;%L zDh|>2ueXJ_t%JQz0H2^80=%rAKx4d4ThsEqZrN$@CS~LKLfO|X4@C1u%Lf`PTnWre zbPfUH1BClfW?KFLAurcxi06;i5ziaKZEb|Ijg#D^eW z2lpX9glO52m-vt`nobDuA%rs1$^y}{(RARpG_C~d41sjU71H8mfsh{U6CsrOA>~3^ zC^IcSlmSA%kVd$zOlY6q(J~=_v zegGja5bj9}c|&=C^xMi4AMT@Zmnct4`QfoXBkv4jwB zYg#=~c%9$V>YVmFkb05>y#aIMY!e8cjUq-@%uj~-(yj(Bv zGB1KvRIAlmeOpmpZ162D&e~zE?e?O0*~gC9k|TnPJhQ!n6A|fYyIxGX z2Tzy&asp3%6T#o;o{8wsXgwfW7p#A-aR?_?P-j(L+MUki8;Zc*6j6UBVsId$52niI zO3oIvb}$@fG?z=IynVCNZ~_%iz!0LSdoKzfkj6VXZTnhQS2ta92NmtXSo>+%b6ZtH z6DK^`dpY47o@SG&gb2ojja#SI5l(&j<)`-5qa7QIaK}sT)@s?k3hP9LXJV5xST8d! zrHQ@4{^gvh0eiSwu)+C-I zATcK*8ph1R^@SU;N3A`T*W7BZwd~dzi%3-+`56&%3rm(4^2}&0P__GNr>VJEu(@R3 zB_@xK>elQ{Y+nR&qt$aSxbBcg{ds4j;$A|pX6Iea_0tdT+tF#mC3W+ej8$E=vgc!l z35uf*oTH4jPD`4%`ApGH>kV5Ip66BHsqlODde(NE16#`r&xOY@l^>nxNff6Up}qr z3^;R1NNh)f3;C4|+i8rH7YXEv&-wmw-A)@Vt2ev;JowxwchU8yW1O<%O-85 zQgS8;&kYzj>=*XI<=mnrw6{?;o}3}AoAbUmhZol9Bb|&?8+J)`K548lg^|cQ*FMB^ zHV#gZY)cAV=5&}`2|rOGPipPIe!ORSjkm%&3x5j5tUWpDII_YlDJi{bOvs&SSB@R>(#u~gp<2R9ouP+Y-4LfaY%*X33Y6HN2e|kg*{OA?k5ko zeNDh|_QAV43s9AGrw%GK&|24PbeRI&Xg4PgqU+^C0 z`8NkG)t6GgZ?sF0mckP_s<7BlJ5#`!LRNSNlW0+Aema|RhS;Un>!{wfN(qLOP6o}X zO93zFs`cR6f#mqS+FV??_WjSC&S}3qQM;(e>j_{Ztr;q_GpL7ZAMa}HFmk?o^1`~E zj;r8*`tG)E>N$h@_kO+O=LmElp5sx8cGc4Bd0W}qva7zvEj-ubfrq23=x^q9ZYV!z zIG*r-_3X&fxr{$ou!jr&U+6r*TmnqH{shV1u`{=ZdZzU?FE9`bmAv&ecYQsy@S@H) z671RywMHw#hbx_hd?fpBw{8Ws$=O@UExElv+IyjMa*0BEE-;7Oj@8kXt!>-gJ5-sB ze*hX`V^sSIyN#UTFbDaNftoMOHKY#D^}c~hbai>zzWnSXs~;cQI#TS~dkp=wcV_FE zd1t_8g$FP@U$n-;?;EerNVDQB1)Syi$8&Uec4d1=E|*izJVs&=yQp(IV~{LFsye0h zLn@YW^6_L<_2In7B}0!|c6Xy_YbzxU5!SrcDV4TU;Z8Z95OS(-8afPFY&Py69NUxK zBmda7TrJ-??^1pwX^Z)+HM^(+v$vOQxl*=v{nS5RFt2UBpYRb7d#CJ;BlVk)TgB?K zdsPPKab|^0Mzj(*a~5(eAD-=Y4En?ISV=K2!Sye z-k0O`h2NpAw`nh0$D6|Il%?;trN3^Q(RK)dP6OigPfHK;7a&?D)AL<4|z0q<6AQ0rC-cT--`P(QL$`C>sAYLZK5vG+1`GJ>};Yy(G+u9Fx zO^c7_2dE?5hxps-0H(DWuj6Iyg?fRI_qOuUxcGetCv)4G%keDMznu~cwb&t zSNI*S(GZOb5Wjy_Tho5W`x_5Yc-8MX#M_HQXk%KqEj>W={%zogmItE!dfO1M2VmZ! zYx#Ex|NH;l|JJ_#^VI2h(<&UcVP5>aqD znK(lh^~sW`a~L)_Dyfud^EC^`u>_kN1)-q~qsK1ZZ4$ec=4-umX z#uO5B?sP&!R)4SES;Rq&qMyqq<8svG2B4mtAFz^?Z1D!@YOzyx6ha%*5_3Cu}^Nh_G9-qy0Twx;k?^ zcPr~Fu3lEsTtYO%nC_28zK?jfW6ejykzLF!S?_w@-hJ;~tDhXPSzHx;a&hj`mPHYa zNE~h81Y~aBnK;Y?M00C&>8jAH*&CaNNWo!uYF{{U+#J|PTX~z+@8xpZQu!Rn>?+ep zY#nI4CC!tbR#xjy?BVo-CNCDwoRmQ2UXusKO3$L#%r#RM#0RAj!PLS$N3$ON@BRkR9v5B_GxGQO!Po=C_ z%J})g*$G1^Cw$-|Ln)WC^&(O~U0W)yX{?vl7qRcob+l%OCrxYi27boUwYYT~#EoO3d zHt5+l3~cRDn5<3V4a}vo&ObIWD(25l`&L(cTJ`t>CT_fyXEaw6;m6E8P8Kd*suc;! z^S*Gel5>yIc>n&*e#aSU=Q^{ncUaKAT$;x$z@i;CaBg#9U+pwp4KkI}__QXy{?Jt` z`8Wa-6kByLSGP0=8`Xk;P=U#x6K+>@ULDq3hU1MwHf<~Af~yUKH`vQWYPGAg1Sasj z_E)A@u|}h5_bORo9*nn38)%RAbVhIJeA1C*NzMOL;VI|+we}(s!&f>lVYX}*bk+>< z#(HJP^?};fbK&~ZvU4{M7+{d$(YB*KS=2h??18xjr%*>;)V^vC&fWGT_U5obw&I`@=y^S^B&oI$34FKHO ziXH3sz}3G~`GPIzY&#qDU6quN6@1u2Z5k=uPqvr+0}&ryFp0o(90wyHIcl{Ttv%9v z*o@U~a0%V6?yDls|7d2-@F|L9hU^xH4Uhu5O!v~F#%I+VwZF{}! zAE1x~#rejGo&(MCm94H;Z02I(A30D1KGE3g&9*g#4@k9d=o#S8EX_a6u}VIpd^m~G zvsNiEfsc+(tfmRgl*)Q;&Dq&-U{&o~RAgbG@9FHpPU^emluNzCgx%L#;Gwvb(KshK zF~W1P)*c&sqYFKw^~}^kaM&4Jne$wYA-&gE-Wi=Sr%1#q9)|a#@EiQ&Ikup_p;^GQ z75l7()U3Zxu%EEI%Et%xsyld58y|iCBcF4gsW4+PQSzPMv2YH>$2<1Hna=UKi!=3) zk8s!4(OU8>;?vZ;o@YqYBGHZ=z$=Y^R%7JZ48yghy^OT0*P}J*3O`Vp2iIW&b9Tb8 zp3xXSeGNun6sEmby$OW!Z(9fFWO!!|f!~3)iNl+=MO`8Po0bg_%1tZ#s`{d3-=ut? zNeNL1ze9cGi_(G2-!us6A%rsV`lCR4^cpQQtsH65GSPD6|DBCM7=h7Fhm7$`<9P`2 zJp3kK$Q$m7j|L!GU$_TemM@wodVN_Qfcw{F{DpL`(R4z*9Rl$IxPM*7UkIUG2+_I; zAw3F|i>F7+N9zw|!!?wPmJf&;PrI#bXdfVr5Yj>j@r00nTA$+OfcU`^Ef>OV%T$RFwgLVPs;wD@@bXuBaE2yr2Va<{b^$^qO*+l$sg`H(lnlP_K` zaX_?ui02A~YrM{vwG*!|o-bNI5RVJLfoNUvx`AosZu<>H?*Zxqhz}v&PP~pE`WxVP z2=U+1Fs*EW+v0(jrM)hMKKzgn;AP`@6-+C~nH(5i(f0nf!vF36@_(@3{PNH3(bvDW zYY~stGG1L5>|g(zukF42Yd6d;z4ZS4uf7(MTX64)AG~|tj!sUj(Q4TT54QB8o$!}! z)Dr*VSC38fflF#^F6Z@<`v+6oy)Ce(Q1=ZCz-e>wLm*nu&a+1%me1T9YC|vk_cp6e zfFgl_+8_qS$0BBrx)Z%9pZSYC1bIs@;W*FWCH`9JdySs0ioj3ng_@UcoO94;y@@*m z4FbxpE^IkH=f8LAFuO#gYAARNhR8zFXHN4hip=vMQIuK0ZrP2eznR36eJ$eo&PrA< z?=xGE84^hMw>KWDBSkbXH3Aqepa(O+7->uP~WjaIXZBAhQoEMo&|Y{!kZ8_ai`QfecSN{PtM*msYg zxd+?q?AWDNx~k_$^)UvRcB>-f7ex;4*1NVQ+?`Y3+9yXM{M+`y#~)cHnY7Vp>;yGy zijxHxr#j_Ds7;(<0Fy5#;xF zX+`aei?cI#93y($iRhk)Ef}?^4|b7Wfq2xvtol*!Yp!c8mrB7FRIA-{h8;MW$)ue? zM1^fp^HdgL`|Q!Tww$;Yfsf+pjP-g*3tl<{M?1p_LTs;%x;^W5dUl|?mzP%@S0S7W zg@T>dTN)>}1{ZwXFojXK#&N~?Qng;9h(6=QDC){EPmkMUd$?Ir?4@m%(^eO8i;6sL z@f3rI7mB*nTUKLU(;UG7eo-5`&Ba=?>$W$kGf~LdzVN7`IX)elrBg}UKdRfT&WV9= z0B@+^0)+2owP>rAyog;??dRbQ%uqsPZL3|k~; zTzp6Ca?~9=lZVqs7gt$@V8^>@B8|7&S$lfY_j3g0`KyWWLFB2q;u&)H~>S7xPGs1qbuRuT;j$%>)yUIN*TP{;S}<^ z%{k%ty4L$z6MfubT}F<_Lrq0nbAGqDuIkn>U>H17-4MoRWHv*RLHTlhpoA%$30ue zuAcT|Qs)yY`>ShZ_b?38?y=Ur%(FrJ0|w1%K566O*eZA4ap`hwvt@L~jue+qFW7f4 zj(r_%c20P}$AFCHYveX1SJpSIdAMgSozoMo8B$^FgLR!Ln4-X=xJ#kU&e*xmN%u65 zRO6-IYnM_tlHY0r`<_Udp(489!ge5@jB%VauRSe1(B5^>9P;4?=~28cFAL}ND6;O^ zm7TUnE~PhjHu89w-4nHY(77>pfz8gi2F(1pP!yuQ#Fkv@J=8@LU{&p!V^XDIV} zsWYpq^GVOrM;J{DcU)DLxd+fD;94To})K6=+vA&`;AG;JhCLyl0XJI5Gy?doG zAytXfhiK0huBl(Y{#qlSkI1v_EZzC2aSt5oFSht+JEq0{crd)=xu;BuAr?N;lGofV8xTpITkv|ls#l=eb7HVHeUnCS9BKArIyrl|cJJR}Pe z+smFj^yo9mN1P4xj&sdrys@P&KBLH<~nLaxesHB}_j>aV|F$4E0F0 z5|x7DStIw`pT#84dO}v$sYU?DCP|V@eTx|VfM`NjBI(RHNhpPHSWC8dzcNxQG8-qT zpD8sTN4O@jAV3tmNd@Ajk}PYpqR~BwoVgb9+58XvT0CFUvB#Ebz+7{O#?0Q*B0n>5 z98<`#dNy<6Z3ME5xYrfbzFDXD<%Hk3I%3;7Z~Pujo?{Uk1G5PGrz6SwuJ^g{DV7j_BR%6P$(v0-TQxdK-j*L-f253} z-v+49P!hmR9xk5iACFdV+1f##B0MWKHN5q=SQmt3v>SFoH(sHq1*bQMCi~_-E0O!2 z;L40z)#elK!+FCls*yJ3##gwM|J(d8!Nn-| z(li@@9J>mBhX`&Ow~SFPt8y;>SAP;`6$;`h;d^x#UzNp(IJ1l$8nB5lGSd_q>oZzp6$7!%|H)=2gG0O2*fSyRb zHI#UjJezZ2I(lPN^={_i5}rFML3V~k%9`tR0fQWsIYGe3k0X}b>*1M00J}2e4#VwEUveEwmeKOHO$g8QhsIKK z_7WJM+RIV)eT?R@j1Fkg^(Z_O78=W7>YRs+<(95G7o}+obPiB&;6x zF545DtH-srnvXVXS{9Bvz+aUKuyA{KYJn^RH%z!vnH?^!kn&e2GW(3T4K7nboXJbF z3%C*cx3UYqx6}0kf(K2zmSQ>8mVT|ex}zb^t)ci=pS$GO0gnTt(Du7JK6jA$`iFz3 zx$iP}X@t!9>mb}K$68S&;^=BVpHCQ%Viuj=h0*IgLDwAgd&MfSEl)JPQ=a*=M#_fb ztvXu);fxk}uP{I~CXMOdp~Pw=2__3s=OG!I4ulKXYYC_e_afH*eP3AUs{Jf75|v@} zayAC2V)P&)OM-aV(LwC(Cu4yQ6TYCD(leEwQQ+%U!eXk7JIx=8Fc@T+{b4 z4z%)bEQvlVF+Xv+k~6-|P%K!sW857>cB30*T|MaS{5f0uf?hz^fX(!v5A47KFvB9# zz^xI7siA3Nh*$g+BBE5?xFuJtPgRFO(HV(Tf=AptpM-{++?;WXrv2Qf$hr0nCsvv- zp0J+Qag`*PH5&WC4x9BP4$~Ss4as$#w}CS+w6{F(_m)L<78h$ssiRa&`vlCknr^cVxj4u|XM8>BU1+^5t;|@%AXlHJBl4yYG z$IAJEK1^7rmS?wQTlS|IXSNO11C{63{t(I63(6vB8S}-pI+J!`^~Fz|H=d%K6N_G; z2G6xU!reEH-g$xVe`@_mAaosj=>-tgUG#9ZFs{_=?;P%XZ;N-n)S-ucVmkH;dS7>1 zcVhNJ`WB#}fHISCApv{+bLLTIAu`!VTl}oWJ^}FOdE9ATf(k2+TVy7Ve1v)eP1aB0 zA_N7g{0QI0ciA7>dp*(3ug@ygQr5oC5saEmq)YGe2AzHjSsy<_p@Pe>71334?f|ey z9;s#eNk_m2nM9~@m^_V>=SUbk$FqTOA4z^S%1_GZ|3{B)_|PxuJgFSU_G${GA*!o8 zK-SqbQjl!5b$@!}$j)$s)`HyYjxHS(xJzre{?%7vGktylJB^uRoBwYl5d3CiPZ-~4Yy zg+RB;j}hf9duBK7?5Ka@$O2e%3N$P9n#b$H0N#HdoXhDV7@P)kRFTkvAAzdAo6AI{ z`${7)D3wLG;xKA$W~}s0phxL@c+@wp2%b(4FO9RJVjsT==XArU`5gF^y;j{4L%`kB zk7rpAJ||ZJt&*Au>Kr;(*r&!HWxWv#dvk{MJ0$cx)(j0_lt#me{vqe*fj8b+t-b@b z8==4;Vj6ckDpJ=Ny=?|{G^01)l*IUnsN_*k5(eA4j-jLbZ;u*SVh!XZ$ zM0D%z4`T*+yK_#72TSh`WoA%q0#|J)mPU%e1+Fqz>V&X(UE)z-J{zOObk?@FJ{U*4 zRSvAttbQS?2_D!ATwXS=E5D0wqWj!_Kb?UXkFJSx{+G+>UEK~Wcntsa+;<`gRjmh3 zJI&+B+7ecix9RekDDKcs>m$yv+#%}c0~A?E6-$RCiEZLUT5^2rSQ^Fo+h&7LsZG{6 z(Ob>G+IaD+Xg!K+v;Ns-9!P#!QIqf*E#GnMpLEf48L>EjVap2qjvJ` z)X_--UGHnI&y|)H*7gNkmhMk3j7{%35?8ilkkMV1@%MC}CYDi5hW>a31D<|9LP(V8 zC6m}*Vd;F;b4{F=7C0nHmNQa2z)z;%2$!O*TCtj6(wNYJW|7<`h-(8JKfGYVHS7%C za91z_e^CLNq?M?^%z54PPp~Cx+iTgByDU?Pg+A$VTVzx{wY;xBzpLZ@Yf85tVRvHt zO|<&hrgBZ9ju2p*#2KG5tq&YYW_PP@Hj5Gwtscs-I=Pi)xRC{j2wO>46 zV-u#pxAIF6SHDnaGRXqwGvap{VpZTg{EFG=Lu9P5qTyK;2EPllh}r>XR&q%`l+)gR z@vJkx%!WJrlW+;|`fM|&vPD8&5~=Y^6Uw2#6YmmBdB=woQ4jm&QHy_%dAKBT*lWSZ z?M5j7@{A{cV6iMU&WPqHY?NWdC;RgHG$WRMItR4x{VyH|Z073vuk8*2HfW()=uRyC z4h09ZkESzq3oPEJv$(GXOdZ!umhXrHqZb0ML_nf|EWHo9m4Q3o^J*M1luRKZ#||=A z9b(Q`rttfW8LCBB-GK~#pbEsV#tU<=MZ-ire;J-J-`pj*QT4Ak)o*H=R~;;w|HRDa z=J8%AVuG|Ew6Na4mlu*(12g~kG6e5r4EHtz(u~fmYIAeyW_Pc^|4ffcY6%9-M;<8G zFHVXS2Ja6}iqsDI4rw(0hE>G){r+g=intquG}DtAk*PvMMm-FCtNnhYA0FB%C)KoQ zy}9x1Xza!5!D1aYJyplr|GuxVT&siQt}y_du1ji=|0^4~m;X@vxk;-k`Bq zq3lcxT@^1J>XJ!G;w-x|25!OPbS^&&fv$}hYx7*+?UjPP=IWlV0>St@N4>$A#qEmS z8+f5IYp~wPyVfFJ1kaL%T>p*fWf-)&!bPCn`e?4o#}gn z$^omQ*8Uokx$>WEB7WaccWd6R|Ij(nwDe-diJc~&i17~Y-&2G(+?O`#`er5+EB!j&O&|q%uY)G8|NylI(zu!bwHM}&)qCZ?u&3W zS$`{ujlykQSCpl`d^{Pi%TMCjT;&WBR2v}Tja%bF$#JpC1=R4^ou~p*;~9e4{{^Gz z7chxbVw2f|ohB#jm2s~~0n&UB6#u;!Ic8|m!t_0T_xQn3B57giju(S3*4OA|hfo+K z76^|caQDYQ1SkJ@$&SP98FFA56GXk1dP7>qjyzI}`GphS%7~p7xCT2hNJ@E&oj`qm zajzI7f1Bw`5|EE;L4t_e*+AmhL>u6`JX0UX*7NT$ZN^wEE=-^Ss~|C={;GOa3JQy( zd!`))_$q7$AmQ(1AHDG125_IMs|6!f!;1GPNcKD`XZV%Agm!H7j4a92O!*CVhyPhUyHB$g>^Rf1-w)w~QwcN^kB#%^z1fQdt%k4-u!2 zgz)B*tglGDhxBG|-3$}4Z>;J)?W&bxP<_4HXg``I;f6VW{;3lYyQssF2cdjFA@;F| za|G5n_?`|l+Dn0u4nDPE+04{bE+*CfXCJTnDrPLJCH!JOgfe}$tu<{r!!pVC%xUds z38BR8*B%cw+131IBlbpFi<(7u){m;ed+SO=B9Jz5AGb9;h?b{{nNTeYaXt^(m$F`R z#)f~X=eMnqM%a?&(<`w34)P0a(PNdRwq(*xyLEy03)4Q8 zW#svvUSAA?&?xPvFK}R44zPJ#dTj4}kR%Kg4s+BzXSIa2NKmC>j|x2o4)ljY-#E#ZcBRhVeXK zxsNWhGOonS*#Lb;;fJ}IoNN{#GvSg)abT1;pVgJogq8gLMd}W#p1x!4x7WKv!idKV zIQ9twIx9@A!!9RSi$ZFZSDTrxHvh-h7T40JHrWBwRu24P(Lqrc{&H2F?BC>Wse_vg z*u2QAW?0C z6_%|Y8~Avb0@|L-IrAn2z@9tK!}I6f&r_8Hy}bDv{nil6N2UbUA-LPIxL?5xTV3F? z9NZl?*Vk22=ClxbVWGF)7XXty(#R}H&|arFNY|ILM7K}mt@GfoOEq1sv~H^4wS6C7 zeNSD&H63ydlE7@>yWAS?O%s*yG6as)3nYUq-h#Me4wEK5dyK;Zg3|7y?mDJVFa8QA zlMLZr)6w#|W^7)5UpeiGjP#b?JxqWZ5Ir_HTL9gUn`$ssT4CC?6&Hv15Y6Ws6z7Oo zpkgPd)iXT~4rz&}_a7g(9RbQiA(|@XWc}bYDOza0M_zNKX2hMS+mCppb`mk&VDGgi z)O|e!@HsXPsgfJKJ+4D4yygxzkBF$|t;-6YM)b4wtA143azoYXm6fhe2Dxf0stTJX zU(bO>%&H1S3uhC6>-V^jp*76Ue$0cW;UD_1qz6^81ObH$GBgeu20E751U>H>fA5f< z)KbDjG<6q4<7;)^>Ip@%r*-Pl|9Z3KFgt1ASF2 zWrTpKgeb4x0L!%e$IY~|@-j~Y@5_G61ej23Ta$~D{K7gDHc+trH;Jk_e7*T(j=Rmr z#y!cI>*K(ou371W{*b#)&69CQ&Aps+>4XC{02_kl1CIqKEN;RbsHVQtKtmm2mU+p)r1A*|fl^D+`L-T(Uw;ODO zXM!(!>FIV&U!G@TnZ>!c35MJ>&!%?~asue}u}FqE&DS8)!w;G3l2U9gE8g%p&^$TnP)yR1L0sQY%sw3VMYu7} z*^?vwV|X3e0sbw@abY4>K`r0_9hqmFU);#?i6}tc380i4Iaes-VhlZpm<6?dizg`K zt7mPY&^_ei{{L~dJ_iGA&u$+YyC~%CpFAWk_K*75tvY{y{Z}wA|MU}7PfAloWF_Bec(He ztkH&dqx|KbO7mm9u#h zXDaU02DdZzz{zxHNn)Nur0RUHf!*7PBw(e+*#1u=+4$QHTY9lH(z8&wq;1uR$*9+= zV{cWeL3Q^6eh?`CH$@ejxBC4dkW3WhQpWcERqpd&7UI~EcrsbB@9D%>(+T0-7a#lR zPG}Yi0e&38Jl&?BF)ammN!_^|YpyMVPh^Q1!KvS{f+oaS7#$|d<}0{sdD#YXKBcBQlu|m12syz6cQIP&8CT$OsCnI;b{+! zG!q{Et1;5WRl8f_TCjIZM{w3n)SWbxab~3avGaDtaJK$l*d;zSQU&hALZAALm0NYE zU)fg-%%x}amB0T8&xWNA7uuSDZA`5{0yD|0mR#7x$JRZ1F|L~#y{=WiY#Wms$CMfl z3I%Z*49`V4des^6W72uk82ED4|SsO&L%ge@t)Y;oNOEb5wAB1Lw zTdi=9*vf_)XQ+1oKNtSB^yYbenKp0Ffweh1Y$RBFL~o;!l6=lROXXE~2-2uPc42fM zCruoiQ!jNjTSs2Jk5+KGQUQZ1Bq~RyTR>%7wvBm~DZS&bB)*L%I(zHwQmApiE>--< zR3_rg|NaO!^Ch7!AL|alzGaR@F3|ps7+KfdoMXp_ap7NYUva8)=#@8_CPSJ=_BkYv za}Jt*s8P!tx`rX*XHdA;73Cz$u50Zr9=*kFFF8!gh0K15cL>L9?H#KxkFrC4!_fPp z*mt|Ht}+}Nez5f^aN#tSwqnQt^W*9gIS798?RGnZv)u$8dUAJF8L}z^9N>BG1#Kom zldod?i_Y7u2#$RD?L|kk44e>yqm`37eJh?0v!ndB6J?3cT<@_+I=;wlP-%N<6(&1* zvR7!qZ=lC`JX#vD_q$?0jox`&SDKpGB~OzBQjx$7&0B?;eQ8&gZ#D;a;}ltkwrTIh zJT1vxlT=-N_bF>?{I(`K6%WWBy8H8afu2dFWn7C-HHB{VX;q~&180giy?tTTr-TL0 zAAULPi_qi_AKI?{R2cj%+#$fKas96mS6mdP?Ph!8eHy^q?O>zx>X@N(an@MsUGgrw zhlj)0$!4{Q837%>ryMY+Ig$E+80u!g1JG?z`HbdMOk?isu*;7cXk_?_hE3Q?oWrJU&gAMT zb#wb}r_N$`yW<|^r&LPdNBy{6@db2yRLRRnIFiAZrXBa1qZk7|t>hBr8?8WFJ(gb> z*Jmyc_A!i^8s=VFy+X>t`Vys{-uMvrf(@RmR^G^7C=B%+61)hXp~gS^u>R==ND?qE z&7k>e10N+j2l;15z#8>tK&YtJX89^|thVumeEg)wPr& zRydaQif&?K8H5NhD0_j_oV5fKDTrp5TZy#?cz8Duo}GzE)6-#}WgGV6BE{kq$GO`w zU-pK(YeQ*NvNYS5SMk)Wlz72)h=z*8~rOi6Vy4xX0B~1lWRSLy%m&vR_qi=4NKc@q ze^PvvuW4-()Vf(GYW&AH#iwYB!6*PdlXvG8;foMn9Be;Zb=v9Xm7U`7p`n4VvYNAl zjEv2>@rl2bb;!oUK_%=XY%2uK@4~i7(76vRh?tZ_>$6XPz+q^_L{wSW1k77P`_{ke z`olPt@Wu&cDG0Rubc9fn&yf}+;t8}YKucVXmy2cXnlZr{-tF=xE%E#0q}I%a1?TV9 zyRcXD!v~pr^Ha$=`?~9b19?K4$kp{Dy zqsr|SrK;H!o%TT+ibTF}Eism+_-A5OLD?G{pGvaXB4kqA%_bJ13V(D5yc?}uBw8xn z;;Vzw3O1{rR?o-~C)Vl@IUQ(%KLC|O5;!?nID&q}AjnleRn~+vWBlaLdpBDmY-yZW ztPOUsUv$e9tGx<|P;Okiu1--~{3BTR>o}FRHcV$Ch5kcHB-Uz@lXY?t2X68=s$8*{ z%LAzf6wRt}`8$Q+Bc)OJr|-^05mF8odFL3lkp9Bb8A?6r+nO#(#6TMMbnkeT@@IGk zA3XN?luZZd>LQ?3n-%}Vz#;T!Npy+ih((|NNa#r9H_3FpSD6)yZG-L4;|gwmt;`QZ zB-nZ})4H}ly0GO@U-bcs8UkcOh6BlzS%6uYO;fYT!XtyGw#x3EvDRd+U1%~NTgR`* zf*p<%WJ+JxN%fS``WMBD=$@EWtrr*k&ZV96J1v<|jr;2IIU(itcb!L|0fX@2#2;x+ zc(!M{wlJb=|16$g)duOZnTwV5Qz(Nie9E`Y_nwi=oRVz-qKK_!jL#Ga+P;NUjT?6P zo^Nu)PaRgTyCQe)j{CBxjQiBD#H?360Ddig8$TE6hUMVR&4=djaSTaz3TSNI$#Q)V z#VBabu5qO2iY!|DFkHNP*=w}!xZFl%G3m6mVxGh_R?7(JeVkxYONBTcZd(O?)dth< zf0z<*lvXcJT2jZE7>w$2Oi5ByS=V+cNvINr$C}ocxZ2N&p0r!;itv8ZS@(Xy-6IY+ zqxsSCO0>KlezVu(5cr!t32D}ptWN4JH|xesUdx@oSm?-~s%|Vz9KxWEWv%B zEkdD6MN437FzJl3FOCQawKYgDadR=OfhU|wo9T}?R<-EV$whA#&9^)H<|JCaAlXLjr^U7J zxN<)R3H?HM)zq349(okcZ4sMQbxoSCJ=Ps41q(fGNDW#zSjREbO2 zHGxzKB5IqjU0L@%y*xLuH*ERp3c-C`rg#>)nXTo!C)n1fpC^#b_aOVyx!F~3;E6SW zGn=bqS6bdjc$V_zibW01GfG%clH8T6{Kb8l!_%*80q+yt61l@e+fP8a$X)B-i%V%s zL5)tK)Q`~y3V)0U?%jOcEI4U8ww!dze&gA%pOop^+P$#e2-tj`Fw7>h>tGY4Yd4ws z{BWTLAE=?=QjZBU$$QlQmA;Eca!LkKQe4VbjlTV^Y``*l=RO zh!hS{_FHgkE9z(zb6}>tE&@LqQ#<*|nhVeIppEDWA2C&HT-pd8tON22D^buyT zo5o(-x^+rEi9MW}9cIuyCV5sk8~Fs@;&c<#;P3>+w>&;ISW<%U@(lMkAz0T}9NRJr zsfn)T-xja;KQ14L)CdPruFBp7{9rvX>tT2t6{P~5+8&?9t8ee{EAvEiyB2J6d}>_w zBxOZ?Xl3kHkQ4_`6;e(`)@FTsrCFHiA_!o=velcApu!t1ExRDM?=NugnU3b1zP2Em z3P&>|+MzrFw$!&0j8zb=VES6!qSQ}!-n;*Pi`}9Ew%0_S+-+}Yw<+W{bNLvg+GSRA z%~1O9-%*iZI~vNMtT0P5ti(EC80)Y?FJ?1BWZ4;7eh!eM5@FJmpNWk_k?(W~!`%Hd zWDKq1`vEc1PWmLTRT)^>^!A2h9*FVvi=YYa) z;sDsz3=(OQ`U=RY&6Gw#&$ZNdA-{QxFFWL{X21X-I#*>^3s3UXYxAHX8g#;trla4A zN@9||rx+oXhL#f{U-D-S)}AQ73Nm8H=B_OV?kK+P9Oy{T>Eyx7(2T*+1EI}=8vdWU>n1O{ zld#uXlw}_-qtx*4u#|vJIl>krPvXUJV&$6- zX*0fb?X`~ilxXhm?NE00IqFL)sbiZ_$KrWHv~0(8vsr7ysGjs8G|9Z&621sYQ=a(f zL8goWb{eb1xQgb*lBYVbnM<5R6>@}V%`*{~^Uzi*C6iS7Oi-K^T^$2Cip&}K8yFdZ zjS2OT$#UhB_u`6!+2129mzE!8EJ>F997dz-H*YYkr6F&)5}ldk9QS)*Up$;R0*TY* z<)&jtc(wdf`@rr3APe7dH#avBuPexX`fm$%?5-l-UwdapuFe__k#)Dr-W(900Zc1M zsovzI+2&2A@fl2vw2-Bm=?yS&DD>dQUf*ae>c5 z%wWX`X3#2FMY@iLK%>|xm-FTl;{Bl4-y}oC;4i8>HzV@ov^%w8FwpRu-XmaS2(9e! zBDdh$6WL!Oa8f=mb?6sq<0N59T6R^lnRGy*UgBBsd>yH@C@KWiFEh>Zdl;h)!=5NDm%bfik?iy}%?wFH&@^G=!&)@X*) zOZ>q|$tBGky>_tf#f9>E`gu;1B-Nq!#1g2S95UXOj$MP?`SB0^3r&yuzdO#?85Ou%DmRh}Q_~1x_>aAaiig zgzy`Yc(^n(DA}4Shw)yaxsFYWAb7B->gT<*FHn9-g`3QzuqRf#Y7-=`6V9F|Wi(dj z&h)3U*CZ=CG1R*46L5U!0v~gaf;RZH6KwSF^9ix8Y0$`cM6h|^W&9CgKOH!u>?iKIbNzJ%C|p}SD?cT z)f-=_D=-MOj6ficayTETRhNV*R$Q;hkMVjBy#5hTdD#IuYxLkO5OJR?;ufQ!eA-!4 z#PMNExAD7#hS{{O&jR^ZAJYhW|El(1DBm0V+&h%5xh8(HHfU(8RIlG0{X4NxoONQI zVsmk!Go4}f-T&$UfjKiH!r0oJGCX%~qYd7QnI?!`s(Fw-OrK3b@a|GLxKaafEGb73K5d zSJ5HjwXFRU?5KTP)$JQTg#c* z%%_`QYNc_#@srU%gnu(n*zxSkzQ@jzM|fMVhUzYGvkwXU8U|+Viv?u+lY_W#?{62I^cUE8hO4fBULJlK)sXNd znAT;coUK3hz?DQ#;hhSf=WdB=!D%@Xhr9llnUd$k>&^abmsu=q5CebLhbde-M9&(%g8_jq|z9IAh3C0UC2csZeY(y_Z zd5{W~QLJDnGHTxac=+K-+N&S!zm`p6WF1J3D^Wu%a$tKyqvMeN)N_X5n=cYn$ZdW0 zqeC<@z}CBnr6k>GZJz5&nq!?k46Pn_GW_4&ef%;GGx*Y@ag0zJDROxjcMAR@$)F#) zI_`uV@K#~MFE7xM*}5iaU;4}}@OkJeGR^+b6LOd9nd^gxq~(!*bY!MZ#+W`c+54=e z1A5*gHx$}nCD8?P9Ir;d>*C)++c3{X`d%JUko;flENul_8o6}K%Hkk8()&{J(jFJ7 zW1W4jK6OWq^V6nv0IEMVO2bvtsoK-NWR2wWZF>{LM8#Q)(3I?r-!ob^&p7S|vM{UC z#QUn}o!42&H@QgcE17Wa@qdghvSP5|+hp6kc=_W1u52gwvbTY+x)-~?ic%vkHz2No z&)j~Gin3FI#x0^=RolRKqrH0n`OW!UV@%k3UhL=1nq$i|7;~>L+WW#~0o;{n(e@y- z?&GCKGZV>q#|Yu6Kp`bPEaRs4Ua{9o*w*3htqRRh)mGl>3*oll(FWQwmo}TtvyN1& zsHo!ShlQl%A+G&DpJD#yoZtTNT}j8xewzwSXRMRw zE?FrV+IfFiLdnjpo6+CD_m4VJK83#}_7BN+f>{WZbVy;DS9EfLp7@0s4j`_`Vf`;T z*qi70lpbe1PL0h_?rma9m0OwV=6L_g^C=p!yJcOSzT;mZW)dqbZ82SKqm(MI=3Tt? zKy0lkB2r5uWn+l2%%K+gTUD0o0X+i}V}^ZqA4j{|mBz$sTt>xmt-cJf**_Uuli;m; z#$t!z05eqNlCoPI>}Vr-?=eEcI8h-x2cY4Hs5j7~S_vfAP_Cl~?}zq6h#WogZy$&H z`naMo%*??)da`5vt;aB%m@9M#d4*3P9XYWpK4SJp3{kP7)aZM}Rg~G{%8H9TVWxHc ztd4Ad0X%OUX^|39#|Xfxd1cANb4ib?e)4#k>t0rM-vzs)C2eKdaQ_&*ni}Eec6HCz z$HS7Gq0aXz=C>?LE^6rIvKN>2$kSJ|Eabj7$;Zono*;(0?ytuTD}yvGPCwjfL7Tej zZ`iBP-;Wo#g0mJAGqMZ(z5*7mZs(?pajltIDoVe+wUNx47kL+Uz=p`FWczDmTJkUW zN-gFH3=goxVsm?5M~fDGo6+BNy^l=fx*qH6_MFLHrS)n9-Al(0=B#ThsfRo$)%3}f z$`2_G^o(k?Sb?LN@VUp07Lav}`rEcI&AJo^htgdzxj1es$$&|C)v3aT{}$l{7tuvc zmtG3&pls%JDYbKz7JAhAY2_u=$q$D8iDI6*x%4%6X>+6r21%idID7gCTjo2#D3cWz zKSSj+zA5hRxUMl^XcupRu21{Z`VItzrp37=#7=%*S6^fA98|t-IeL^QICER^yx}ai!O|eHv=uoxh{hUKc~t}t$LDne%yK% zLFJ>H8!Q}0d_1EsQ~y5Hq^I{1!ABaTf>Mri}&G)+zI|Xp{HiBeMZsGlo0~NyR-@U+C{2Rn^~4#6OjMyH{E6 zY;}E$TS5zHMoZH|UHVtmojA>Ze0-yS&spZfx-`)i5)d>y$37kV;|)on^8xR$Z;EM# zAnyT1!CTef>!>c_*V*jauQw$4UVVcL?P5b7 zg(;JIvom7(eC4G(0-m0BMrE9;;l?!XE|L?T>D7seIlRN|KEB0R$NAeXPYtqFFwzzE zo13vRfS$^|*Z$p7CLRA#*5eUx?cd#TjfrcqaN&{~EdGPcgOKrb#e%7@U?a|gqt;l- z>fBtJ^~**-kJjh$FfaSG1`$8qU0b~qoxXQyXgCJGic2wfKFTn|ulm67&9b(cqO|D? zbU08l*+sP&Uu=;HW3X*|>4gx}e1-SdwOqh19so2(B-I6>4dD}4trK}yZ`fGHInYPV zOdL<-YB=e=rOa~wz-IrPEkM9Bt+4iZ0HSY6Z{-X=m&_wr({`1eG)c6lk{xR23jUz( ztH~!NiMb{*_6wc<6R_=_A9es{#4c8s{RGN+sDS?$6B=n6UFkQZa2cBLds?Q`n!`~s z)UG$L7<;f@`$P9!_1lnbTY#)BD_RCwtYLnnvrYC8M@s)2Rga7!;j9(ylEP%p{(mQU zq)_daNE%r_LM;UqbIi8uf?ir-@2^vprQdtZTP>eKt+20%{lD11!3w@a7IX8_h4-Qv z%FuX9w|(Kt3qiJK{>Jg3R6(<2CymC+Ia?PbI-!7{iXuHVXI>~9-9FH#FACvo!EO<; zy(%T5bV%j-?2u2#HL^i$mhyOWyRa7Uh#&kE44x?125TE)KM-8?Tm-K=hVSC|L?S)v zT*j=fM3+tsKc~8hGp95^`N}RA_?Rj@ z6iL)sB!-SW_>M=ZLRsYu*LWBqN{bG80*Rqzye&Zmyp+u}S8_sD>K3~o;~ue}0^$02 z9ROFmBdi?_oNj~755;l|TtVac;SKDT=P!BfndN?C#kM9dC#|2=K%0(>`#i4>^X6*< z?*gDinMUfHlm2p_V>x~eEu2z?s!c>gxWnItSQr0rzp2b5UHQvh^ydRs`^w+N$kXV{ zfV(sb)6u4`tuA6*Ixo=!6HQre4FYfQlsWJKqHMl4oX@z?JWdz+6;e-Iwj0#Es9z}8#}C=#0$sp= z(Gu&;!dgs^q@|Pf8P?DPeC7V(kyM-Ox$82U+LyeVu_&c$!bH zPuzf|;Q}ruNB~m(T>^L|zbO73s0=iRka|lIeSFE(2bsZEuu-^2X32{x-iihzjc=0d z-s#kvf77o6f$%VAh>W1k^$~YUr=sT$w0(yEX@>|0ucaGNno})Qp*O^wQ3SK+SgemF zD2o)S9ZaOSY|E~(%X<{bZS}0rsKqE7n*7x^8-YId>Fwt5^e29M+7XtYmMMWS=z3M> zooV55g9Y4TdD=(tSn^VM1bfw#ptMX2zLuBmnx+XM6`k_^_dc%4dfKV8cn;0zD->No zDvVaNn7H~z9@H~XwDiv7_87!W=(>U^SrjqP^wRw zZTwRfGDV}xrK-;adEw=2ZJ!*B<`JR7oeZbcnCPN?ZAKLdQ*4Rn-ZLa3z;54hq1!Y? zXjn4syerm6lh7JwO>oP5+U2jm$6rr8btY?0F2-#+sHK_#)n`=Qhh?qQEUZlkyu-+1 zdi{=Pq=St4hXFi>*T-Qa5RP=i_SxmW>eB#D2P$`%)~guwwMI#LK6Gj9%9NS*dPV*y zuazx-vYwsuFmz$#pcxctGRn`&;&J5B9ShozZp34twq$yDmXUlkFY3`Wa})o~whl{V z(aTP)x=2{fI`*`aknN)o{l^7Q9U+kiPEv$C>hVHTt(hp`fO2ZzDr*Ys4<}O+%1WtB;JRV~N zi7orxa)$X+Mg6N0Palas8pr^M%cjcjdlzejOo52#zOyl5;Xe^K@J}rY!V0q-#`+8v zD?a2qwLJdS8cMfhSr?MW0(QGgs-_>$v_j2BCCj5J_~htjSdx(u1RcGg3GX519P~>-;uF(>V2r@p)9ZFhU3=Rg>Ar^XX#T%=iS|+oSmlxabX2qDuPK zE~&1Uz|9tFAVUmAhKfVHOl?Y(vwihs?(F+-r3r@LK!5lj}`j+lC{NQSP1G<~+ z?SSOzPOp&DI(Um6z$6JN^uCk+){Z(3{Ev7W!F2#U(vBeOKSt1kR~gix+$j6&5=aHw zR=%OX)!m6!P*6>r6&i!)9y-y>cGb2wo3RfJ5MTr0l>`2@ZCza0X?0zL{G_yThhXD> zHr4U-$%)2LXq+Ijs&nIoufpMf`Wd0~&m~ChILcCze2R{MzI%!ceIBVl(z=S&!$=z< zZ|PJD$fC{h8xIHrC;A5Jsi=PF6RGs$_=jvmD4vw}8`ASI52RCd|Li7?966?M1FU@g z1-iwN-vQ%o$aT2pJX!ZC1cPaTg0MDMnd6&-$GK4L(l4Em`$?|4&iCBt|{m5V;<; znM_^qh)jz&-h0XTonecWQKM@2*XYjCeIfS|Y$p;i8}f*>%G5U-0B!b>C678sms?ZQ zdTpL9_J`~&|2BNwzV9*;s1x6A4GB7vpR=OG4=BI6r`%ag9|rkj0etPUe9z2~ZQk5R zNNtUayh7`AtpOrKs#i>)8F~K7-!+o= zBcui;uOJS+nhtuh0D+7Nn^$1(oB-LeH6`LuZaA#T)DJt1pZHJIF5{D|H&aA_kpxW~ z2Ze^}X9qjRzbGFAp$kd|=uHb)^wqN55k+62xsPbdi6wRP8>G8{*Sc5=sbENPnmh69 zK|H%`#_92t_@oTwJdha8SC%l{Jq+L_8`q=T67AySrx{QLgE*>V&<|#TeEPA|v~=y~ zPT#4fa0O``u-6GF8UG~m;uo*`k`n{X*WmY_p71*MW=NZMvV|>2jy0wj@mY=Eg5v;w z%cDd?y+y0)C|xO8>DwF}wVKrqlOE*tCIC@^+0eR{>V_R z&uyo8vQw8cGl6B?(nmQu?_pd&f>_{;Z7s+n|FN0*VXDc{=1K6SlBJvBF!y}Tub48c z{{u}yvc6AVUR-O9u)%m?U+v-HRz&V#WGk*VYMMtaqQ?dz42ZLSpTq~37{5~vmONJf1lu^qRae3~J2M$&L z;c>@4zQ3$J-2t*btF^cw~#bG~=fvh`BRN*il#|L zoSe?|UPt)-{M043K76oZ*@XI{{fc@ZD!E7;;cy^5$HynUp)c89vu_`77VLV^wr_Wi zEtShyI+Jy&yFwJMB!mNP9|EjqIs z&%JY6hphGrj4$l?p?;px+#@CZ{Xti_G;57+U(dLlGt$zTq&0<0sH@Lv{q*#3sd>DZ zSG5;w^|qyF&b9Yz_TeX=+ng2<(+Zezz}7Ad;jH@F)>+-ad$`U4o=4SkUgwbZjpiHs zq37MEwS+S;iFaEAU1121yl>!5Tl<=4410c{@oxxs8pEL_)!&m=-!ghujQLoh{fbKJ zx6e=9Mk=O0E;Yw$)GA>QW zcu`p$3m;K|$8prU@UMGvXve25^|fdBAKbTmO3%7N(H&kO#l4TTpzsBc`)7Kt>>t-% zf*R&D&RkI2<(VpEv+8oyCB}a7%Wv$V$+o)z; zQk3&@GPN#o?(lLXlME{2cbWHhaMtx}ayh)>!+PXB!NBq*mK{XW}e$bzSY@ z9EdOAdmbO?6shOxrSM(ny~c|j#|6c~6ijM8P{ZcznG_l z1DlT!NT;Ia{X-z1&)c%*1^a;0AiR$e-Ufb1S>T732SOdZ>kx4A!X6LwC-6hsc~#kv zPTS$0vouN4P3IcYqWMC4G=y|QJdFT^@*&U5`ZFyLaiKinwtj>>Ks*n?OMR## zia3N2A40VKczU!P0f?r*ZrOM`5KWJ!5u)`HqG|DR0OJLs<+w)60HI7sqa1moX~YAe zT&OErCj1WRK$!DrJlAMD(KO;iet@`WJoi8-LtOYBt|8B~aYXwQ;(-tsLTEEy2M{e! zTDYHeQo>q2PbRpE!g4=Eq-$D4+~4`BV?L@MxK|7ZW)B`7Mzv`Z)5 zyR)HJYKVE5KIcx*!=OWL^~GLIFL6b^crRK-ME!T)Jl3_~>Q8*-M-3+@V&m&?pNc?F zyNW7C)=MHjkdoqs2%AUFoDm_tsuyJJI9=&w6Z?C3vHjvFKbtz2zt1pDWjLNEgqOhw zpMGiE4?nc;zxt)y%1S}NjYpO*+tb6269F(RCVJaPP0-bVMMyyG;*l0Re@K=f ziK(Z#h!ei(&snQIaEX+~bkV&*!hm6Hu5KtIYUz9^0yp8(S?aEJhN$R@AQh2_ln{gg zs%npqZagM0FBfcPGInAPA`ph)T6WQ%HHJR7NI*b@xYyl`2P zjMD)eMIdp4v>4306A_$92`2JoYt&HNn{!W;*g8Vu5r-@=Ob3^WPF8u*z7vj)3~z5dYG`D|8gYy3SC)~khtOR=_w zm#&(P9lLi{@|G1|(x1h2%Jv(5mkx4&U#Q!ObO2#9T?qLz6XE$#RF?=eLlWZwU%%S39{4X(Ej9~ z{;>^4!ogh0rP6M^XP?`5Is*<)S}uX~v(Fwno*=DT%;gQ|O6_jnr2|pb$HB_}!I53h zr>rHy|Gf|1bsL=bt67)M>0Zy-0ZBWUL%(=dcjk=St<-t3+a6o8yk^y6PIIU}37=s!{QA*z&0E_U03SWP zW1H2SOX{M|uVwP{1r9j?3u<;fBUA#4N(BoenN+UATwDCeItrsBiX~ zE~SUW9QN>-3mBv@P~17t!j1RyXSJT&i>uf5OsW>02{zH5htUsX1V%~sY+@Oe8R-$q zSv3zXX+P~8cdb%L*@fm9o1^S$Et(ylbS$Uw@xkIu>&@nC4UyT^pca;Nrkyzh7=|$( zp;0T`x^F&>CMjIcNsIOMl(PEqk#*W_d+^?S zt{#6mr}J3PNIZgLlNbj(Fs}4Q?^3}q(2)?wmMk9_PuwpD@oLg4^aqh!;J5u?w@Cn8qYXfr}^?J^nj`kS#TkowF+_4f2QM}2QHKtr* z*08;YCw07;gE!dZozvOz6sD+f76%}eeAeG#7BuJW!NdxBH{zU_6~ZwV%pp_~W~WET zt`-g>@}2kIzd4_jub9tRCZoNtx#5|9s^=ZgeBO=nxtv`NyUyg(Vc|?u_HIsV%|m=B zJXMrG&u3v0g6}&2Fcp9#-)RSF;H0H>?j!v;qxSlGb|Fo#gI4INXXvF03#nASn+)K6 zAM+b90XHgHw`~k#6z5W$&FrgO;l_?_Rqrcr3*~azB>`U-INJ$t1EK8SM|sLHr>rU0 zKu=ABAKFedgm%J}wTtEp@dSYMkSCru9-zbHKzx8`-Y7)t4{6c7gm^y)fk$v#h~|$1 zX~6FofjA2R$VlR}Ns5N(B!&9`ArBDE7xIL(0MR@FLLRQfhdkjL+6W<xYtA&zoD zyiDjvNDJjd8rNtUAe0I5p?oMqT=*TXAy2ffc>Hbor_~?NAMSzhJH$<^J6gx<H1FDZ-eZME-PDJqK z#JwEC)Z@jtE#l|y*19@Fhc0Y)_t@>;A?a{-A+k+<_{A^3bz|SjWZFLd{3qV`zY7Qq zL0;HylcbE#7a}`~Jd@IuUaP(byNU z=xVLyip?kvq6S6<(s9Gl*a?pEZ`D+JS>ISK*{oi~zu#}U9jdYV3lp#;;$cOE@%7xi zhz6JpH%9hRjY7?@*6G`W`^!#%on47g5<%7%(T@~RQUp9wf=I5xXh9td)kW3^DTS^G zTO^zcA}B@>MG-?!#q))*fAmv=F$>|#1k1?OcyM1E#fzo&>HBOGIQgx zvF!Hj5|(lal_lFz+c4rFf*^wXSEzo@h%ghur17FsjI_ruciWa%{spZU5*G6s@1^Dv zW|5Cp8^kNpR5Kz(AD#59P^!3^YAK6^ zkk;>VthwuH|6eYnuQO454O`P3j$kYc4`9r} zIIpNIZQx~fU-MKHo+XhoJ3Dj9*YVYbo%GIZqfM_vuAlcnHHs_{s+m zq^yxp<%q_qkMA!%+lIpn-)AsYU=-qUyw>hJvl~_SqR!gHlHSR+|A&(+?YRZDkK>22 zRh2f-%AjVdF4^8m*P7jlt(HA(2LE@jHI0y7fe;J^O$ zBWvocV1U@j{p6i(Kc`@37VF$t3zmK(! zNVdW_WS)yUSLU_OFncpv1DNnaO`UNSTM|OTSW2m1*Gma|y010Vm|?K?bjD!Tps>7V ztwzn)b)teWIZ*?~cA&Pay?bZFKY+0wFzCTy@QSk=M@4ub?w-%OhvKzd(w}{N3}9}L zw4c^=7V2r>I0s|(H#>D(FCiUyuK5%G>p95WAR*k+9!jcje2{u_+_9v}b-R5l3GbEF zE|iD!-=)okUoZrVDvw=07|rwgjU$z(hni#IA&fVi+33Ngmx)DL2Lr@Z1cS$e8HnL?|*#k{rsnY!t2f(Lr?`q8t`r4w)d{rg};yTH|O}x`}pg^ z+x9b*i_@aveU@toKs0}}f6+Vv$Opvhh8B)P$Q#Y~s=NUA(fXr(i1#}{$Q$B9o{;}{ zs==RLefqnBhRUOXxM<@6qIrP$1OOpzT0MkldOXi<{kg3j0u%YNegN@wLMR{d5l6ld zqUnTq9ibc$PXpp*qam6G+*THdrV*lLLtLmAh^K`BFju6JH(HK3;I?w{_)wnsPI?S^X<;(3609nXYaDPT;|Gz~&Fk1#JJdTOEI4Myd~W)r1HFqyQI@gn+RiqPQs{uGws;+=A`x z*ZfO=B7vtqy?Bc-z{9Vr$Xs4HA^hV%e7l#;9|AX$iZ^PjoLhvKL458*_~OTZU>|?} zBm3r8f2BQ+w?4g0i@-zjrckMfP&#$OBB&w!kTfW!7wqxQ zi5)kGwzXDrh6qFs%-6CAaOjSM#?VA_7#@0&+~nmQBjRaY2Wodg^NIApaz0}<5h%6x zK*Y0%8m$jfL^xZ(>*d9T<{i(hv)9%Z;pTIo@=2~5D=ObGqcmz)KXS(}!hwg?j59Ye zc>euS$2LSTLNxaJW6KF2)+;Hub2O7I*r0o3BWp?JunC5}!AIXewo4H`Kl;g!4F?c- zBSf_mNj1(#m@634r~Z-p-0JqMTq%mM+_00QV<%wTi>!zv2tp)O@EnV0U)23d)q*|V zYr4cxZUM=Wd25|%EOzNqBREt*0_gEc-}X;hB371cMq`E1q(jb@vJkdSmxM}JR_%Ij zM)TORAS+M6%pPLOkwlHiv6G9zu1{`X% zr>Do3nmM-@hjrV!|IqT<6F70fNdWVYeJ_|>*Vi}RmTS$fuQSZv(#pD>oYX}hFS%nC z<`s#Zz0;n1ct#ZrwZLc25Sn+DQJ&HztsM+HJ$+pIYBjrPZ4vY^zK(@Un^h6IT7$dm z1-nw4Sf5$H8lU7R2*|7*_Y+`$Gm56wV_lH|+b`Qq? z#hKgQo7Y~SwCf^JudSdn0u}Uw-Mt%U1NEkT@#W{%AENr0bO~Xkg>ZNQ^A6+wFoZR9 z!%OEPHpkK!&+p#Y#DiI<5naaZqGc%`i zv)Ss}U^H?f8?Ub$E6a9geZ}&{oLva>-ha4dFCIO%t4`C^FrV$8*n@Z9u~w(&%o7;7 zoU4a*?CD*4-_>=U&lj45Ia^sNxffELFQ77>R~;}7+4nGok+!?Pd}Ct{$+RQIu`g0N zY_=&%f39INYR>pjuu;s|srJr`TF=%>No#AIt5wab@Tsz1vF~<-XTsO7cN>=1nX{Zv z+v#xPj4v3My-wdHakKfdpY=IsSPFN?13z!Dv&pmKvv=>hqaix6b5!&5u-~fdxzM&R ze)757R^%hlh5A^?0~HDfO@CcHqjHCI7Gjo-h=>sb?BL40Xl|qw}NBzwq<)(X&JCkG_A@0GEFLn!h@Xs?uX1|UTT6O9ilNRH1hC2gcd zIaB!XlMk(Va$?KE>(&I-Rda?FA3(miQ}H#<>N&uNw%!m2Q#f8Z*ZeN}GYh;zQW)GJ z^HFMYmU#@RQ~T4!`c8V^QXU2D9gu`gX+Xpd%eykR4CtTn#0XNMhoc(-Cr zodw%#1!q+5Y3^IXKP1!f;?I1sk0%!st(V!({*iyUDCz76*EwHd>SB|SJ|S(K)S1Qp z!@LB~!BSdl#u|VV+83NNsK2vE@YoGrW4Z%dj%Ncj6EZqWx?Tt6ghJNPJO!siJPW}a z1T6XR#78}F0^7ylYH4LnXP(Y~o$EjSlYgwZH-|!@;Htp9=K1`nTuJtzXL&^d# zD^EQ5&buT5Iw{afZwfDKCqT#(&l|swrvvQu5TbdafwU-u-=qOiIxt#a973M>T-=s7 zK)n8G5b}q7(fogn5g0m0AVakBP#_A^@&JJ_h}RRY(RM-d&pO$A@AEHFi%jysDd6?H}`NQvUjmDFo-=WQT z9U(sa4gr|f56Xu)fctn`Asr?~v@IZ7o@;17T9y#c2gKtD@v_lA1JmMwP*(`idZt0h z^Ro1KJ=4m(>UV%pep+}Lyl(wKv`zwfUp5E74~Vz0f?j_wQ}$<@DyOwO&R2 z#d~~yqjr+dsf-BJKmFwsTU{yZ#ki;!qgm_g#WaU~A`t;D?InVFV|_y}`9s^Ib3}x9)fcQ4bTZ9B$iOQg+RHtEW${H;)~<1Wi1LOF{%8VsAEowUzf8VW}Ay-HdH&bf%6OFI_P4xtQ=A~gZ?2K;4@RB~yT zB!Vdh(+KAE{dewKy*0K{wQTiz)7PO|NZCF%&IUtY*N5BdZX3;2q~{hj_MFv^_N=gU zZYvq2WEO3wJ`lNudf}C;7UCHdDa5{rR+t3sR>Pj}9oqee?>RFU)i8*(t<|y}i5PYj zG)?kQZHbPDKsA=!5WSn4Y_0O!{9oyDM*&VE4!>S^pey@jv4Q$eZ zH&@mbaf8BGtL}EQl@!)Xr?pZ$zj8a z)r#B6D(VbDBB@#~+Tm%__XI@lP{c8wK(A((Y$2Vt?fVaHcW>Wq2`*_obrJnA#gJCb ziKwnDX?$w1r1R|S7d7Gdjg3s0!=3XP5yCf&?-dcus9Zle?Yh@0fNWIq&bV&~Z(+=9C%F1(SNrCAKB2H^^QoM- z3v)v)xlLCbxEyL9fUCLGg0Bxw6ma~56DaIFre?K5D#J=vbgsZSTvUB+ok3qcJGJ+> zi!Kp+f3u)0m$tdNZ2OIYwG@Z#%)-*F?KKCseD|L4IpvOku=j~%Xs3hJ+l;HwzJGVa zs=`(5C8CXpy8mUbWrev5ca(t_*3+XS>$Tfn?vu|xbtVyKZ&l~q)>_q>_RCA>n$tn6_cBX9eLnlEO&(wTB~DVaKa^DU-Ni>e7zp1^a9;!}tKz(!y#5Z6z^d z%fiJu^@k53zuE6vNqYys*qdv4n;B1RQG1rNZBA{D_*fvk?Wr#?BJoB$hH0G@t{$CO zHl4IwF5~?@I;lB6@lj}dZQ0(tx2-+C;A+at!l`cU$R0mGveNvO@V;-~?;P67@`~YA zeXUZm?P}ioItQ_z32rfdB(~VYTvO$omtX*$IvbY zUC+C@xn^hMGgo)zKRqna};Sm7@IBiC#Q81n!Ej8yiYHe zGhT0P2s7_O>!|ZZ<4$Njmb3>NDxc9=^7yFh-utg~CRX%*lhA&t>pa4KFCN_Yj_P)* zcPn_1oZ0hwZsI|H0cN-Mmr!44>5Y0d9|CGR&)F-S3Ct;VxF_=K8?zwfS=4?m62Uis1=NtPTXH{LDpDW8%XI8V1u&;=uC=Sk;6Uvhxb0CFsSttLM&Z&X@(OWVB zQ3b}v<1`5GN^c84qXj(k)>%yzbg>*t_d)hmHG+zh-$R9#9ZCYL+ zEeOAGNKUp$`QAwJySmOuOs*H`6d{L%Q3Kg5SPLUi+S zjkg&MAue1AI>}xT;pQ|;&Ji*#`_lXgx}L3Z26iz42E=WP!=Rrfck*w#es^YYr)%ePDPiTKQC zMYQUr@#v&sn;UD^?T>9^rC_Z_Q!kg=Q<}C#y|ANlmMN{<3=(J}AX=@KtLE3?cLuG1PMVxn8&wS`%gaqk%zzfH-BLxy@aE_mYCI=EGAuTbYJs@q4OJN zE1qRF#d>K!yV8sQ)x<>oX_H?$;{vtOnuwo*2(U-bPer5_ti*NcUO+PnUp3RYJ{Ls0~`8gjc!g<{4Tgb%7ID~SmG)sqt+ zH$;d!;?g8A7E$@ez&b<;w*8RCfN@e10fUqU#LHSG;|ALc<%)X{?uhVO6cGkvLfx~O zg(b_YFWA+hj%(psr`vWfjPHH)p@?B~#~LmXBBJV2?Lx3-G*=j{Z*@Ahy|pG{xGX|d z1alj&tn*e9p?WGJ5YNEP{>WB^b88}!*2+0MXbgPZNzLJlqm~nZvzj{?bEr~bWWBnv zDcUq;9TD3()rY-8yxYQT!EuI`!&Upr#jNH;YXc!V9NKKJVdv^UcHs_?tja6T(!5o3 z3)UWA*h&AKDZF8B3cvCqz`owA+dG}jp9 zelNP@EH)+~d|MYYmRed8&fR#;L=|~adu0NnO#1}y%-GOG(kqt~PPiKB(3aQMHBP*2 zPVBIbGX@h5HH5Q$on13_e{;oFDg{3qId!v{tZ@0jQnO?0H%=^-N!c^uBvMvT`)jL3 zXH3xbvrmZbq}@0rTuhyVRqUY*kNa6?`{-C)MH9OXOIZ~UpI1#F5Pw19XYdmL+j8R^lbL( zT>GqMnS8++t*jZ2Ho)7S=0;il0|9Lu9M^rCr&Y3aEuJD*&*wA-=j%4ofj z_H3TrFqCixb*#KA+js1&-*ILX5@^`prN50%Proni{X1)Ve<-`h?ws&1lS%trq-ON| z5pE%oHtcrndOUOn_j@0F;5ZAuFBdYdj*bUn7>a4(1Me9~8ZIWWDLH2si)o#s+E3-Q zWztDEb3u6+_!xIwI6HVao0*Oz~;rt!dZ)}AYwBNCD z%bw-~O}p7*Q|rvW@biifbx7`^dJKM`GS4HJXBYN?k=Rp=pI@8-sQ1(NmY!LZg;B_d zGw|(N1yN7uqee-AJ*`-0&ayujl%7;ycrGFRxOw-U_PYAgAG#TspZz=kR9Nz6fGY6H z%8J`Td==3D5Z(rUNLk>Amgl|InXSLQ5^jUHZ7W)iYoH0kHN-~)a2tIX&r2XL5Uv36 z;TjFVwERFkZ#+K`ZzGH&nwR@{8zDVj2AVz&zheXjiNFBd2TpCYBI2VVq=hgoPqY&u z5FcP#o)AB+j%n=x@pNEXdI&&B;~MWnGz}n*Jk#2bmLmY691u^Bmksq2Lb-5_mII(Q!40VSxxs7m+}6+NHRK5}EsnNAo5a6P zxoN+rg_o6?2BF-v5YnUYs^3uv^+W^x33L7XfN5<^3xC@%t<9H(e~2)xpFcFbj#S{Y zN52xmG!~Ju;2sN6t*VF!{nJ1D3o92(BEGNe?)I8{{luOQ1Q{==c&z>C^FOfv>|gz* ztK&grBdLXF*t5~donDknMfZl9Oy>*_n&ooQ+Kof+8%)GfvFH*KybN#O`_TTM|NQ^! z(oCOz`A5I)-QO?JPgGh^x#LU<=TbDh4t)NjpV*In@>BcsKl`~$Hg!bg3`A@pHB=Fi zikHShUc{>&bWPS-UN%6Nm!mI}6e zjA3`q4@A3^MfG<_XCkJsr!?aP5z=MX>NB~Lwi;mh=@1aTFqG+b56;GO~xW()sK|=zEEBF z@vW{@ZLOHK+|s3p*$X?U!Pq-4`G;jn7gO^gHFQ^PMh}c z{?mWQnj-9BgdiA~Q_e!16D zJF}KwL=tboDw=a_BxWFtwN_7$TeiKDHyrr9`^jgvkV-qVQRpXpo!5T9wnNPYHqKzo zB$gH(FYx}lzP9epfco_#yF4FRalve}l(Cl9zd1Ow-P3_B=My$N8Cykbi&Kw7RCKjQ zi%WQr#v7*ARCtQR31r`F*tJo==MqA>V%fdZCYBPeen|V{vyoj3XTZm?=He6wEsINb z_uiJ3*0=20^F3#5BeBEYIckmU(NWJ;1j{1y$4DI(()L1lQO+c6q&30DAnKFL<+Mm_ zb4Jf`cVd;TJI*}8iAYuBII4Hm=Ga) zQ>TSTV|#Zw;|@wt=X`P8amHq~lJzrzHO7$*w*1!fDLbv#?dn2p2+y!thRKHIO34{X z744~Rx8r+QZy44_Mf2!XXXlDd<`->yd((~&kDMX4Sx8yEGj6MYoBmTviHt~2eR>1><>~O8Uk))bJMuH*P z$_8b!@X7AcSzs7yovr1uS7=9pIs=J#d;vK;Jkk$Bxl~9lJkp`kdU(hUBZgk_s#7fA!+p3UDm0^dHm4-eu(q@UwRG zO#KQ*qak@%>Tvl%n?N(MZW=HLG;${$kxUrRS@d11R8^~RWBVfN&Q;LNeF*~JNe8K= zO_vdU&`zEO3Wj~ypZw+pdHVbSXMjN?eEN~84Z2S=*gF>rGQcyM!7E5xpYj~U!|J1! z!cGAWsF^hA9s_UGKtsmZcM7NYjG~~3+QQo_acPd{62h~q+NRKOq5``Ls6y2m#*EAM!6&xS7LfzTUaAT(oV)f->_yB z;Q6rcl>vppF3=(TMjrpQhhxcwKp%bdx93)Ez5Q}m7&$zIxl!w#G@L?g;sISdFzWxs zt5+1Ch_`ePz~|-Ty+f=c&Jys88l%ZXQZ?c!T&FOwLm#UEn*LJ2OCO~4dr6bqAYnFehbs|M$MK2_nK7h}?_n`el0g&%5Y1wb=p`Wj~Rdp_UkmW8Iifk;HW zc(zhl$a|yT+*BqbC#Mw^QhxBmpUBqE1)bOHKo)qO%jI4u5IYZE=bg$4rtLRv|2n|> zM)>zS?cZc9g5AdS;e5Y0zgcGUxJ-P1bprFv)g*%5uidA)+UdNyO!nUXB|^+`d}XGm}Hlk zx^{bK9fDoXM6mm?=fJ;BJ6`Q}rk*KtmOIM`cHc~<%#<^abxb|G+}W1E&9ci(Tf3dz zhGnK5!7gJmZA_WzkAIu7__rxHf17rut~38t+L*c7ZR|wg9PBapw_Ts`qWVm%Yw`(p zKEc#KuWx6*Nrdz2n&0Ni#C&@W1kTH@XWH9&=5KDz>5`d1Cp|E+JDaOuST{^T!yt}lzz zaa*FHphVQ^eN@Nei$5bJF5G@8SLn-Xu4Sl>7vBY#ZR#Q5e)0D;yr}<^KlyXHa%oc* zdYRJV*Owt=WQm;3FUtqFS`)e+RY(h<7*TWMj zgYhjj!O&xksaeHHz7yb45DZeUT9hxIp2)4+w-kSx?Y8=$qV^UURQd*Eum}nkX%_fw zuPCdV>ypl|OS?vmxv2!vCpCX4+T5(mCh;6PJHnlG>AQ_^qNBb$2ILc0LFZu(Kx|$si`Iy)qFf46ENm9 zNh>$0B^kqgg5gWWfJY1Y;<%v#i0O>XT3DkW`(1Q0f94zNVE380MnidUP?T#IHZa$r z`Vzaeno(gDnN>zbrJ#vI*5lIIToPdDuH1W9{`^;8%Dv4L))Ndq)~eba$>Wo@GO^b; z;$RMEV1#{O@WHVAqtYDC@H5PH8{<>^jM}&qN>Hd@K0XoGY%H5$;w9cckyg_Y4YGkL$TN(+l8Nit;|6AN z4)~$rsMG`_Khr=EL=bAIQKgT9*f0%P(I>Twe*B}4q|Od< zzWW$NCy_}@a%Dv%5?8ZJnqu?Z(u97mHBxh3YJ$Z>*h|oZ2d6#NjHGsKxjT^SYYEkE zqPg|;8@E6qT|~>op;i;h=rixZ zaZ9#yG2qHrGN4n`+QK5JS#~xS#O=E!gf!wu2F#05zkAh+^txRYMCaGmffF z#z=)C0h}Rf2-0*t8V~CF@=dr!4Z!V7DwM4NCn*S;PN%Aw#|YXyBoypWbB}%i`OSpF z)r&i;a`5P(R8Eeij5#5@sXf#WHhg{-5)qA-90>VvR_n5kHDaV=&!{WY zK~IirP5I%6@5o{}ltePFg7FBo_&aAN$tziuqWt%?q_CcqJNAypa0?z2!!g;3f5>?Q@NA}7sX@K6|xP3#4*th;@ zp<1C7DpHtFR}j?hCr+&9Gb+dmM=2CTKbXtG!M+?H9LPG(#x`id4Eej|j?yRk_G3ip z6wSS{hx?!r8^EEx=La$w^;Jk+s^dAZlEZu!pe1q8(4Y#)N1&B>vsV*hMx&+=N}A9T z4>m7elt)kZWHW<#;{HiP4jXv(;4Ew=u~)b^2AiQkj6!41KLPxrkdY?#r0EIJk7|D^ zUDToZFh4fcan|?&p$&Y=+MywLY3?8jm>kS=}ZdKnOFtb*)p z#H)B7424vf$a6NuJ^`J{nCW#k2aV@PJv=9<4SQx5?AB)=wZN(6Nb_koX#E)Vsi{jL zJGFS#1qSeN<_buy(b9XH_B#0OR#ysL^t-;ASNAQP>-!)57}wVWz8f(h2z>$)Ui2RH zGWaHK3E$P&XYVX;&da??J2M`y_Shzoh7fo)iQsHQu*+>Qbxog4=hZV;I}!MvV1vmg zIP06f&3p`RzATw~HkjY0oY&uI1imBhXol(Bq!%q7fs?Q$yi5eU4*z!6G3C56nQ`pJ zH)W=--JXeH$~cenHpBGc9OJxllk75Q`FUmLYL^pCJ5z^X%Iz{Hlh0)L%Vd{1+u42E z?RaILDL3`)GE;8KmeWn-nZGJPE z{+u{w^330+u058?H*>J_2qw=?&U#GFaR~M}=hd_OBG`E*nfo*K%+&_wE$hpfoO5@! zae`@QCzEfk&OTn{w{xGIR|C%9F9Xx(dFgG#vN4vW?-G`c|ElTx44fYs73ZAoMELo? z_%jtgt>)8snFk|}GpC#?UaG0JM+Wcnub#>33SM;aB1x0L_0_EU3Zih3f(SQW+J|7s zKKW{2BQ{dIiNPX(yb_I`nGKRjqK~i5?TdJU9ZILylg+iPjPTNm_gB132Gk_-oezGb z^ZLF4pZOFBG7-48=fQbvO}KL7jtT`o`Q=ZQsXVRLB>_f>{`Pz{;S7eP0%o=VW|2UD zd}O4PV5q6_(E=k9z+C8Kj9N+^lpP#3)M5DEaa{$A^-fz5s zF%lw$H`IinDLMEUb>#kpK}6OIa#SoUlSqMDfm%&?ruo1)R8PyQ4H5t|Oh%gisVFR_ zz;KLvqOf@tjIgI$l`o&4NEr2Ug;lB68@NXbL8ibdzcQ{gAEQ=PsnV2IyCwcG7))X)Zdd8e1@9NbZDIJ}F ziR;P9Nkuk*vow37=Icf_A#N~uAu!E7FtRk|nsEJq^S}amRBA~!7Lpj&b`D1MtAmCH z`S6lS22)Cn!_AFVHA5p49L7C-wpWomH0J~pJN0{1L$uv&N*!nKgAeY>5aUuqgeUas zRv!D?RN)APf(x{vqy4?TV@V_vQW?5r0;Z2l=?eB_fpZG}S-w0#e}jqiXKq<7X}Hw?-n}JPl6%OuVqs2) zB?+N99vM&yr>Jo>2TiEf`||Jr_#O|biFF?POEbfroxGfuTM|vjrKRiWQD1O_?f|QZ zdllEVf$Wy5;#HjU$jXH)=x3;A?9@#hVBQUk|LCBi3_i%5TmU}Ds1=H}p@8-J zrA=v;PbKM_X!Ow__ORR-h!^u4s%hd3`w)_dFCcMh_+XuBN?*h}T--r1ddUVOKmR-uWAF(lUh&WxfR_1PzCTQ z%!R^--Q%hTZlM5@z8o3Ug5yQP6adCmJ9N~oOQ!|A$Np;cWuIFTNL{QKO>EU<7h~^N zyZX^02!gSijjJEG3ihpyy(DeP;5ov`rKDY9w5P8>FV3KMI+7!t-MjDHl_F>egX65? z9MYd0X&XP7khW1k!@xRIk6#L_E0W*dmPbzyRM^h-B=x2M?8{OI>pqlw7qSuo-AnrD zQ*Wdis1!~e;w)UcbV=rJpVYq&>_T6r4F1$4egZL=x3!uB?okvaN)NrhkTfbKnRDHN zJ6!vCi2exqaYfW@d#~D;>+2~AMS_w6o-im7&9A93Pa#nb^WpkYxI-GpGu)}yfEN=v zDAwfq)eC$ONjAmEw=UfWnyXWTlR_ezc$VmA(;JW|Xz%4Kmt^nY7_@^z$Djs`VxX11 z=0KjG)aC9*N)o`~Tr?n$D}D8^$4Kjp3Qacyq=!wMk6Smct3XbL! zn1-63=Rr64yofBu`uwGTN}JL{Qp{&<;G{bCc%h>c24-R$*N*m6Hna zhCx8qK)3m9?vCfOtF8nBl8*XRSV)?{`=)T1G>G)Wi+t`AHR9>N5!6(2+ZQB-aT}e1 zgh8Vg7?U{I#(YUMqPPe8PL^?B@gtVWO26M%lV5&Vo#0GU>ypAljhfDJDCEN)a&c)^ z9t1A(3{d;Ng?A_x@jZ=x{HR4sVJ)^)==+xD;QWxncQOixYuMWb)`}+7B$3oyr^Y9r zZ#&ytN;9Y>$m<6``aRvh*8#eBp(fxmQ())2&+C9``%T-w37j`JfAc+%@3Kt%?c`Zs z7ha_u%MD*^fOOn|X>a;6$<*Q1S>MT1E~{(Go%cup`#=Q0+_U>5FyCD5`e*#a-vqn9 zNj5m=VXk(v=U~_WjUe#O?2cwG+azaWTc~Fi+jMG@vkvp@dd_i}Oqr?cEGL*na`tiF z7B(pYzJtFMr$RrVYWA zy=)$)jh)9fc0R$B5lopqK4IAygjcCgFmrX*HS;m|OfYRs-=?0OZ~nIXFnI*KuCrf` zWw&QC?d@dB4e;+}}T0;XL5ow@4Vlp z{jy|(^Y_cZ*_WN(CM@gUnZ65HHtvhk_ZgPW_f-?|`eo+9toQKCUkObu7kFvq3#j@G zymMcE_3H;hA9M6yln0}qOr`Y2o>5n6%1A+8Ze>+|{>hiJzP6%_S1KBmcr31_NA&YW z4H}x^{mWl`DW?<&;UzsBqS?w^1y6EOEb`pF-DJ-hEGa9yd%V@v}n z6nYh~_lD`c4?dEsH}A;(4?mJ;55EL`#d`+d)WNu}Vm%p@8s zrZU4lUC2aLD~b%vIv9_AFh=yH#NZ%qy!7%usp)iBX{z>C4h-Vca!2Px^TsrodI}Qx zR?q`8yIqJWqZ^Ba)ijbCMr4?&g}`XYWQJ&B76bD|A;}sYzQ;n^C;b``Yw5#?Mn?3( zQ~(3H08{N+Ol9lRW!1bPXG1}R`b0ttGBY%}A}*3SVg%M~E>9|B<<=c10KN`)MivadSK!^xK|&>B-2g? znS$>H=2U6*ROp!u2W1WQX~M~Q(qy@S^Fb4Cn($H!(c`6ApdXAHO=Zt~)9s|9va*(z z;TU_3e%)X`xrY~W5joyFl07io`=>RzbortRk1wreb+2iTSgtozON)&81ZRupVtovs z&Zfl`PD!r;X8-;7fxCW*rP69PNZ*gt7%f-oQf_n<4=-%w)U=kGHKBl8eO(ROP3<$i z=t~%0Z>AL2{xItPs}K4`$wteis<)YAPsY24?}o zPwgve=23gDu$C1X2p*ia&IA?dkho@~M_grejeVsF@1$9iN~r|=Y{{i77tlBQ+{^<< z&or3GP}9V5y1;z_&r8*Y`cw3TqLN(OmV=WM)%2r3JI-t8#x2mQnH&}?Du`jAnNqDK z1JJG(aD)u`Hs|K^tMHNng0=NEsWH$^r7Cso=jEM(^qOtyb%t_W??@_>lp1iDxEt}G z2|yo65tZx@uC*@sGhZC~SC8Y-7)2z!9%%$W3tr9^Mn?d1*T* z&1zW&ovu7RIu-iLWS{hT#>lgUbOQ5ls*sMtqjJ41^?FN&bCf3&63^tNU9U?f=vHmL z4(^%40}4W(o;Kv>)l0IHjiQg9B;zp^3{e}BxZwppZLeXiaki)p$@NZWQlKw6nRY7@ z@k}IuxzI;tA{&=#Z>;n(h;?H`aq0xq3^wLwwC#ur%xIGS?4&9AG$So1FmL+poU2(o z1E4VK>Iv$sr2?Q+6bdaQ20Uogsxli7F|W4Vy>$bOIejBe&`(k|Q!5SN5!Q~{f@7TN z-GidIynb2VT37R73WKN>=*7A-*bRf^P%}+68_^d9HETN;RD+uIh+~mv)!IFIdRSIr zC~@fGI@jZjzBBm5dOjoLUQ1TO3(4e?!XOP47V={oO^btQ6O0A~*s6XB8QGhf!;el{ za`RFFYbp}My5lh^Giu{we|SdeMu8tIqNH``BZIS5F5{UxAIpP-lB{m5>4&t{m7J`n z={uI^tgW<}La|O~AV((^oC~j{b18}D*QHoGRn1Zg#~H|o=D)|SkqVM%3e7-M9P_j@ z*67)()pZpfwlEIQD1D;t9-pc<*;()loa0;?XGSE2{#3FI81@@Diyg^F7>O6p5zwfQVyYode}IgtJw<;roEet~&!h2J*3w~FjD~pc z@XGU}id?*M8EcGjG6`;o-V=SrY7~FaUkXN#i&YuBypl*ICAzXAdxu5!qe`t=(r8AX zX4GGvHPSW)@1Sc31_DW7UHAcx0ZuAdlSnEfz5YNgBa+xKY6~BOHUot~&wVPK9^gI6 zH=jx$_f0xRfjtf;Xlg*lgRYG5j7@;X@x6+s_;l&PbHNV{{n1R)c=pg=DBUqMvEGan z8~{!xVo~v9M4o$^%~Np94~1O25avVQuH2s#=s4ZL^0~{8Wwh|9x4N=(VM`_hMl+ts zdmsH6__L*Z^*UfofhiPw5tw(LH-&G~{%wwJ{$@IlZ#3nv3+J^ndAyo2?L@xZ3CuTF zlWabKe;YpbMRiR*^V`(rJeUmFbqv^bO}_-zGk+T}zfC~A9_uXY+mxF` zFy$uCv|}E@+3scinl|UPv&#r}9aCoNGVyQbnYsk#+4ErHZ-QxO+L*DNZA`vNrY@7I z$Hc!)zNu%*UR3`@bF%B3KKM6*SJQ|2ZIa!exthP7eK0Z49?Rr8=Vr!o)@40j3Ff*i z&p8gkSfXlgxY!INQ7k?0)QI!^`HhY>wxpw*|}k zw$rx>%f>q|eIH=iyxt^zQy`wa%slw%SD$GeGEFP1n{sq;D2GP}5&(mcqo2Q4TVFPx zJ>SDiX-uwyasIQPek^NXRLK}^fdQdLQiWPqcmY?RZ4od5{t#ZK$xNoy-&Gn6YGEZS z1H7#E(2kl5TU(pz_`5&A%R25ij&`^1z5n&hz8NfA&$pR){wWaTmvF8#H56VKOkY=T z-Iben-;w8!AAo5cC?ibA=xf_MVC?epX!l4)AiXrpq^S=z64YN1H4sRK!04eH)nJO@ zo&2EGmUtqn%!kM8l0?8OkM@hIDMCl#^cU3XVEwU&L+l0LiQ?cEsJ%&Mgncl8#zxF9 zCG2ah+0*EdK`?R=Fwb!?m!IvGWF-~VNWe5jetO){d8rRQjM*Pf!AS4O;c*en##GH( zX(mY%F^(r-g36tt98`O9X)UQjkv7^~D8yCMkS3dl)sFNhq5>dl2_7^$vXzNSwOmz= zuv@oo2&l0NAL&1fnqhdLs9DK;vYGbK{ z4CgcTg-0fwKEIxq>aq%^(vS5IVXbS;zG@;J9yetj`{4CcvneJ=jjk|qu~kTCD|w>75^r=_o$*~;XISsR9ppKYbzWqs8k-CdQ|^pG6XTe#SNb@ItLdov0}Lf1DmYM0P^@t} z!2mNO)g-0Bi~&CAua268J)U3mw}Jbgj;C@^Zpmq*uZ;idS`N4kIs+WXHUQsza&09h z<8~8uTB;d(|DBtvnX~~qTLs;|dSOF~<(dj0=-X|Gdt*fSiHp8JX+FFz%}QB)iM{jg z9Z4mVpyePZV+QG&%Te)EPV2x8Ajd{NEqUxGHE}7_qR+~!S1!u&?sHl740UcTjQyn2 zmCHEKF%M}Q#sxj_V^654+@2} znyfNnD{cTZ$|HejM0~gx8fjA_YZdh8w0I&XxX)^%E!*4cSoOIEzM|RkrFDMrXbLq& z`7x!_>B-?q6*Ma>bAMP8xq|E+o~X7WqdHG;h&t||B(eV$oTDP{pFxg1KA#+y8+cZo zeOy`1rDUCvvT-h5pgqZCR9aZeb{FTjHn zC#8zqxqD0BtEn-{=f%!iUQQ}?{m=(A)cIAhCR{;ZBqq^RRw~uHeniPd&LSIA08U{S z1Fn4ZgLg%ve!J%C|CNz$8^AC6<)bi|1}`RehrGkT0WVYGIh?cLL^d~h)hob<>k?!OQGNMQaH*o{F?EA_UNYHiHB zqt7A@jD|It4|*z4rqG!C$&V`(G=t+2`bFdi2$}`+4CrGVWyH0~oSJ}B)yU*~5kDT$ z?ZQba~027YQECEnzV&u^SR8Amo%$p-+bQkqu2c( z{sbex9`L=#HU)lFFz-7|Zvwx~wiI^qy@gks_d5^XbUf3}nVewq%v=nA%yVypsb~5z z$<*V!tAX?CnmW9iL~zz~*0rxJBba%bx+W2vbqS`fUEc|&zNz;x`0%f51Tt}8Gq_na zQ^sT(n`G(`SZ)Lrb~0r)*f+>zkHN$|doHHEDR;Ja)_GBxY47acBxl=~l{3%uZTd5P z8!&B6`Leclz9}>1cE7xGolTkDhG5#6@l88ZpI5t$X~#aDZ3w16QLoV z`F33j;Cgz#>m^^~1OE6^w=iCX*Gk+88K3-IpS2H*MZ6|wt!i)0k zxxc8M$un1HTPHZ%*y)=k?g2hRR$A56s74VHMQvDsMqaF z3op|Aa=y8>F2DZu=W_S@MRm|W950k1pr4-IqmumO5C672ef|vi=moP+O(;g?#LH;A ztITLP5&?rdmS2DQTsF41q)|N;IuU1NOn$AVKe_im`n{!V`nu`61ilzk_{njpIrpaX zpxN+^JMYNjFFr;;GZ|pr=@>i|jmqZwx;)-LQGZs{1S5k;^Byt}6x7iai{@;M@R(19 zs3ZoPpVh15p?~ml}igQ56ScOLIn={E@Mt|2{XE%-MJ(^r066vq~Wi z$7fKPQmG6^Hi7m&bz*EB0iovYs<<%M z7MR#nHmA5nL1S+~e~R>Hwow08)GRF5yF%ZLfdI{!(N{VS9QH{F^S*oQy3~&j)TD8H zEhQPh3k=>AOjAOGjnL$g8X^pA!LjL&aUW~Gg0-PmCgA)9L(C<{tHn~-AVOn5=FX9^K%`c3V( zHuj#uU81q5MtP+WkQ#((`a)b=l~(Cc+E~|2EFeLw2hH^uI3p79;a(f+6SCQ(P{Sil zFq;|$cCt{Ph>SE!!CJ4~lOCAP?d^g*+&xvnGuI^HS;&)GPgavr;Q3U-9x%Ssxd!rh za?(=mCrYFW*rTuZD{|60^PR={lc@#&FG=7NwI!*E`s~@Bbec_hd~hQ7?p%|F2XqJc z%ZRPiQlt=sK=Wj3(^6pE@AlM$k1~O;p6qLsVrqC%Q!|xJ;0infuC5hwQply`;OP^2 zzIz}WS>O%k`{=kX;a~vg4@@}lzyrMSfGKZ|rc&#U)Etz;D^dVzTyAU@WQHHdmA0NI zOhkSAQ7{shnQ8!1Lz3t8>0wQhxZe!+kAkpkH!jG*Nli{po9M%(dwYmIAU-uP$4h8S zUzijE)te2ubLX~XvuT-*hO(N9^5sGW6BJZXJ8gmSdN|J&(AyAj3{#fDaDa2`Rc+GG zu^!Z(BK_LPB~Y9GO#K=G_S)4;x<1GI2U0vZRFg%w_biY>A{Lec_JjC*T&KDJP|eM$ zwZ(JCAR-COYww^eF>3f?Js7lNvT&Bv+GqH-o8i816!J1b zzhkTkx=}hrp&eaOFp6(DfpxUHAr+_c)b4eIy zoB4e1Q9GLg(Hv;Vmj_iD45o5zE3eNQevqO|4GO!cz0P-Eje?84;s>lDa4Ly4I66F( zX}>F_8lHn#tCiIp`t_->o<2YMVX9njs{dV@4_B%UjlND3V>h0Yne|OMDVFv5!w)j_ zBf1NkwY{~9XWCS?M2Vj~3nkD=K9@4dn3@4M>UHtULqK`f{8)i* z(C695Fq&gCAWzWe6IUQCG5n@L(zBSL&Oq*c_>(u%0;B+tiSAzBPrZ@ca5v^RX) zn~eJ=Z48*U9N(S;ah{1_ct10S&2th+b4*>rvU*I0M_5+ZuE%7LZN?`!>oM7N?W-w& z*}WOC>zluwe2uC9*E9mn0Cwl5qUngqfGK0=cKLaI*b{P=Guh?K`Y>fC5twhlS#HWq zd-iE3lW&)swg#9_u=`~)`MmPCY0In0H_7goiQrr_lk9f<&9E=pK#t>oNWjO z>0i`_V3)Ct`P<~PF2Nqh^vU|BjVWU?ZS1;Cc71}m+H+!_ozFaiDYNSmUZ*avOw41s z`EBx?b@`j%tjl|_>k*uJOwMr#&U(&q&AgY*&(txntgjcfbN+UM-Ny7ocu^aIU1s`l zCL3Pow`uQ8=fR80Y;g8xr?&~q`gf-93YLxivh=$M%kG1T=jBCOfyd7u$QVopeZhgR zRG%~SUBifXUp_mL%bQue@cQNA*18J(zWDOFVp(g%SH&t+s5fWu$s~3??cf zUp?N{ulD^;Utdh=IQ;0eCAmyY`_E+(^2z6q+yV0sx`x%IAGyZx^G#h?9iWh7=;8wNJGcJ+d!R#xS+$9u|1(2pKX zCi7q%>9D-g>Pvv<=v~H%tucQk7=$kB!zsW$1h6B}FpqVbWl$J{r zmM}mF0|}(SRMiI~jiSg1t`jnjwXVdHQBf~RU`oiGkb!4#4h9)Xq~mJxxU;=3hsBy| zYtWfFHA%=E<+3RW&B2UL=c;i+^Sm^eZ!#!PPdk{yOmfMH)G!W%2CQYG%4qH5H~1p- z=U2f|3jLAsOoB;mHk#7u_T=`htE!zsp;4vLRbe)nXCSNkV4`LrcVK`UUCAb8b+sVR zKKoR5@=^5VlWuP$&E8asSkLtc)_3ZX^-M?uCLGlIV3>nKC;d^cTeZASx+A%mjp{v6 z^RbQl>Capm7=vbPv*BDWu7Sx4V9xp&kXh)SRNpWIEuHvCAXJm6i(Y(%=lo?W#OEs>q$&^mj)S zzCPMhkd;;qN-~RGtTBaS^xH@?OrCi%n$!R+9-qjh-;&c}QO!VUYMx4ix%IihhzgkK zs5~q&umjcuzbSyB|1xUnfzW8+4{Gi)^6N=`Aj!m;_TMKD4&;MNIn|EyhJy0tVNJF) z@XJ)@*dI4dI>B($Z{fvkjH)qUy!&!tJ+0=JS2k0Uqc$4m`{nbJ#Nr{Ws~ z>xGn>(gq?yVPxv{Yy|i^lpYR6wvbi9GNawrOUKeGm*mOesa(E#8T-3X6VXg2EeX(v z8a0NzG~ox`#hldT18`vPsHg%_Y8I^mXDGBHuJF99uCK~kp&*A(A4+u6Q(vJuoXbjQ zBp&Zs1Y!z?DV#;uDj;TrVB*n9V<79RDJg;$Ook&#CBhO2g@6kIIjOXPI&>uv7caHz z@Ql&(ACJhaKLjewRC|_Ma@6#_xRH@4_MgwE8rIC1wPK>!Kimh_c_rq@{9|&kyQdLs zAJebmwM%LSNnuM4>rZoF3W?6%q(z0p^w-+Pvy60!RN~RoLt*r4np2X7Wk6Rb*lOTh zvHd2Vc_#;l^5p4(nvIfH*V~|{ShHNrtIsuRQ1hci2Y5=HPM{xZfl-)A391`?$0*!C zso}S1kdkM`hFsdrNz?@#$Fr7#r*3a7d%&{`g@m|#7>l$ypV7UWW8HY3NkfT8c*vkH zm(r!DhsTlxt)-iUot-Uxw(}#xM&|5ZPMiElcV;<26W>;6D5cX=^|MOBKi?lnKdIsU z^x#AWLp;~eeJmQ1F!qX(?fb~f;CT{{$E8y(s}?a$m&aH|n%c&~A@whdA*9$EsK)cf z6})3mV-M$sK3jvas1&is6mpYJB{0W6aGdL}jJTwvWP7_HR1DnO2+E(MHH?8}p* z8lFWi8GuIe85PAdfhOKu3u#p}Ymi!Z1&ftum9R#yf5G$p4y zluEfSqXqDnQHZ@E3B;318%Eei(j;n-(q|?$t*Ir(cN+SxEtg8@$D<#^sCmbE(ES8W zd&9|;3Vw;Ze!Nq~0&YClDTXHQg1&*XG5Fr_{ttie4C!AJXbPOkWb}S*c-8ls zW$@c-OL$RxQ%0Y~{0Pb9XnZ}JJuH_6U3SJR*A+tf9A zc3mdZhiUh+y5?_Zo`DzTnfcgx%j(&6%)P&Ce$Kw^cFbQ^$C+pUb|wS-`@A*=_}e+I zng6SRvp>_%oA$R1oPFBqZNaj>?euNJvhiM&zK^hMp5HW`2gE17bSfvH`)a6>-+>`PhCr)6U;kA86P9Oi`TV&QR#K{&boc&8TK-+b zvNe6vM1dephWWP<2-@JR&$JBaKk)k9_vFjZf308k7n8m+L2D~`AqP|P)oxK4TTm4V z;H96ma|~|b1a+?D;@CqlaM*`57$$0$&@bG0&;vs>1T%P+$3PNfR&HI}kWZhTs(Duz zj2+AICzw|Hq@uRqnTeAhrh2uyoK~umURjaF>?{IgDgs6hj2BIhX}(NGlZ+)bMXD5#0dJ?F zv>cw4WGx+0b9I^{cfp8Outo(6S2`mww|)tMA@~K>X_dm7@mw}lNJHjxuBNE;cSzw* zt2>cr<(_P0!*W>dsflhB{kTIxnV^r+2x|!@j*&3uZm)E4AG~i0sMJ4SsUeTR_>*am zf;kMk=c=t3z+88a>r%)^Rj3rfeT{Hpo86J5w=PNsj6TnvhzEN##66u#v0PPiMh0QH zd2t7G>#A^q^|-Fo!l^ada_{zK$*-=;pxG1#_@GZWGOCQWTf+TgcV!J{mdquY<*!N| ztS!xz{n$r5(}9U=aRy?bmX243SZ~$ZabrD+pTH}c0aEj876{7oa$C);lVEsh?#hn_ zsgOqnTk7AiJCstjEzeF`vYL%Z12iL?NX|}$=+{^X8v~gZ22y^2+tgWQge7uS^X7C_J zy{3OkY6f$&;f~xq0KN3MJ?wV5^XmY%&FUULgtAfH@Q>B;)*$ z;g&GY5(Q%Pi%21A^7jy%-+sE4a(K?2;-oyMzD<}Y@fR=k0#eUQ=F9v-m zmRpjK1%O8rtQP~PjO14j59Q{1N`vdr{~NVIsg1mtyH%(G6qRH;`SscHNfc-Q$w^&q zY!#%2=gmqsrg-WJhvf6UiX<3hCPdF^qzN^yGh~bO?%_WHSrErKs8){d_{R?SO5QpPj%=nQm?sF7E1 z^i*(2db9#uFSUj;!MWWlwj~pGtKcVrHQ>Blp|D2MrgruibBg#}x~E*<5b$u^YscpAqugqrSjWkKyg(p5(E<~fXF zZRt~&t}dpa6DOsjl+~2HDcf5cLb(`DjEigJx~F@(9h z<-zkaf4lKmMB-TgCU9#y9-e8!W3A~%BFm36peOu*R>yi!n554MN<=3^tOXDpeNd~9 z&r{xmAL~Oia|R=!w(SDvi07ckXBXZpxE>5B#-KtJdY|pp1T-{&vkoM~yg7He_~1B6 zK7+f!A>c2c=@zbf0095=NklC+z1N6f6n>_?0jC&>&Ge7vh&T~%x5xdY<`<^=Gk@mH}jlh5=>pw2a{co zVDbodUBa?Ho%g`x9EaenN3iqEyiGd-ugm85y6w!>22;m5&t-KDILn-4Gdb_mIe+JG z0)H<{PFR+=44nPg>21KWe(m&az_M|crSAhQo7d~4?-I;-d?{Qu_U_})W$&;gYxyi* zn$MyYo|aDK7r%a}S`LwDTt)->mTJkT4<5_A*RSHm&?oDwE0V;EF3nr`vYpE0WH=bf z<=gMeq+3%VN2^|vD{FbFf%&5Fg`?BA)z0RYjD~#>2r&C#&iP)areC+{#KmAWbB!jvj=9mt6z5vO zz0$;sQ57lV;2N|VbqU6jV1oK;>P`V5H7F_EpwK7`W|7(-)Z(Fltk>&FJe`yZ1r^D( zOov@HTPHJ1C;AKuF~mKS(Ob(#(4PlPU|7nno;(9HORX5qWsrR4vU>e<)!zqRDq4au#uwfhK60Uo3YuXh1TakjZE$ zm(Uj@4L>inr8b;PJ{Q9|P2kzIP}4F7L;32-o}Mu>m{+$~)x;Asl2)%Pn=2V*Xpbr_ z-7g9Y=zo%tW)F*X3B;l@a{IA%U47oIW4+19_osNtE;iM~n$_nt6!EY9*|L~wDD_B<#)|(nF;PG`I zBi@A+xK0OEFwqOSb$JzdcIL7mpA1PK3;yZz6JhX}-U82S{M)(puJopEY1Aqz@a^=5 z5{ZQ6!P7mdwOYccrq?cP$Z95n`9$Qn+B!35$9mJeoTh@u$0h8ySNh(VoRq675ZlH& z(+NN27)3Dl0oMZe=~h8I>E>q#b#bE)`ZZ**nnwRD*b4o?QK(EGk@fyWj_L#1TuXwk zjy13fBeN#377OhC(P>wLK95v^4{od_&-xsANWWo8tVNwsp{sq#rGpYr#$`PT8jW_; zQaY*igi(O$K7f7}kt<`Ipa*>qU($3WAbh zuZ&z?r6Gk_;LPm-&OY9()GuZa=lAh`Rj#fjq=)+m<6IF}7?|Z0dqV*{HEqoZG&Ecc7H8Qnt(10XLvq@ z+)_KONVip$Mx%-Ie&&l2wLqIAswtgMr=;I)sYVo^HPj^IM->XQR#8rlB#e98+*p&+ zv&X<$mj*te#@|LNC=0ALwn}{~?gPiE)uvjNI0K=OU$vz2Ut>bTlf z^X&F`hW*EL3Twy!EY!a9_UlrlFUVq9e*cGeCCy-4UI9KtRWM5WNdJHI^-3Di>dHYU&vG-4u|7-$}z zrF^dLcv4k*y z7wOua`#+GijcxSydO$PaG|p5Q>+q_u>>cJ+;Z55a_$KX5TciDF`~up%rxV_EJZC%e zn`7DI*;hM}Zrkv(db}Fml!;*1V={G2vg??65$tjs?7mD|R*$f(F2Pyf)7c<<#zuB<~i%w?d>|t=3uvDBA9jrXSvcMcv7Ga8wlQV)-1s-^5}a*Jo;`+1Cg0Ap`{Hl= z`l5XPZIbE32&N&mDbqUTnFfAM3&LfySGmf3Nte#zmZOq^Hb=mw3 zn097Nljj8HIp<){(c;nDjPaS-&Q|ZCEyjGkw>v zY!0uQepkSruh9y$?}O#p=op;|?AA*1Nmw%zm z6d4I>1f~*k3F1Y4>J6#Wd@R1i{66V?&D4YE08`qPwZa-0>xMG4)a0a)ssW~hCRU)h zD%9aVhofOBsSs%Z#+hYg>?zVlaQ_ViVM8JSkqwQ&_ zqf8pLq8iT5g`omyw!$CP|j<{Ij$3!U@ zPrK*Ro}*8{OBsJ^t?iatYL0v5_C0BVai-s_edIB?44Lu$ld3dZZ9UJ7+((@5m`|g!n{;lztg$8q44sqz^Qk?e|B*$j4K+SAB+gqe*Er&jd0wKcof< zqhFTWxEIVn8wY;l9vXv*JU(e*J*maxR}HN(n09LJ(0n@%#(MyUzl*(mj`iyHdXhn% zHtu6H84zD0s*djuDjm5L_eq;egf#~`NFL*kF~3Ep1IE0kL1t(o&B&ZI9UP<1Py!MR zMWxjrYLJYu->m^rXdYUs)b&2s^I2J6TU7xF&kr@+*3t=CTg$6iZjHgtJ~|cgFT`7HzTWaois=Q=G$oCoVf4|^9Ci90Up(=Xz!DabQpU% z)iYM>Ph}(K#XJ~|9P0qw{A{l*tC_e8b?9<|cqhOm;w=S6AU)FTPo#^CbQm-X=b#H( zOO3Gg&Ai}=s^^_r)ufT6eH5+%sqqXDiQ&q#vy1chqkB855m|_N@N9^R547swN%_Jp1s0etOvZPriDhnzkdXt(xkB=97?87)D_@*Ns}PanOfQ zBBee$=^N3{b;2G|@J-FpLKJhvZ*@ZfI`GTq72tSOT~Tx}$3Ae90z)i@YFQ6JL%PGM zRM2)EctDNGy`u)oKyOLUG2YQ>LqD>#T3!8c#E%Vr??OKubucGt&F__(YQEm?jrAi2 zp8>ISN;L}u_|0k6F$Np1EV7<}mB>orv#Q?QT!j(~&bxKJF>j zgdbR_4b6RbfgbV6L|>M~A)09O9W9MLWDp?+3*&r%I;t_sKsS8;ZEkOa=8si~NVgC7 zfAC{2@M{CL0F5ay>Cl@1+r3F!)9$+*m-UVCkLh*#c%8b-cs%lrCfWV4u6=d3Gryhh zl*{Tdu^-cyfn{~=aqTuNbMm+^s%sK~?Uud!nsQ$4zD++)Fy(f#;cr9@X0jL7o~ZL? zOt}HO%q};HdF;bEaXZ;%{M+t>V9J;Xc3abCSvkSvn>vJL<;%+0W?4HX(`H$@DKp7# zXX=})U1qnj%S>I92nJF3o8=}k-}Gh5nV3hg`{UK*nKpJJus>6uiGSPm3CrpeO#Z9X zH+f9VGvy}F^x>R~U6)|~cGe{CGc;1OoE+fCsSsw z&UQ}V{Fcr0MPT~1+nC=5UN)`))80K>2PO*P}xwMg%FLtY{6-XoqVNa=Xz`ddwpV2@dQR(eGFc3>CFZ zXioLnK~0ii2q`24FR6mV&A4AYV2qyEdTM$`#%v1QA|6t!2izCN@TpI#R4T0kNk$f> zIXf9!3N-1viW-2^$yl{`C{PQ><6uA|(rz_nI~!Fq=@{lpe`Lp%rZVkh?kNaMV!ijO zJ=J`PVr_z82%A%v9M=1?k)V03TYWfohC_LB+LLH9A=!{yHB_kKLLZt_JcdfAZT0JR z2xgB?=A#&cX43Qzcm3{NoTZ^O8Z8y}QLBk&j6T;)Dilm%y)JI9VlP)UIL{&Gc^*&^fm?=^A{flE?4DF*b$wIMHUmi{!$EQ5?9*JDi^lz+FpPm$sI9ZIl9ojvD)nj| zYrBwK%!hVz~mH_UTnyCdax5v%CbVm!-n)6|wD7>WLSg;4wuB1j{7WY+b z4yD*=NS1*;u$k#Na0B4NdSs0=iP zVQw(gj1J5|02Chc{e<_DK!2AvR;150AQL{AO0QX$N~0}TuV2>S64WZBzdLHp(NvZK zCYp}&tm6L|5BQ7o+roYAT)ra1Mos#_?YkQ(ImX_QSw95+Wr3SCon6P?;SkBA;}-fn z^Pi~`$Nf?GM&D&zGY0sf_Sj)#AdJXOpo?yL5V<SuhrtPN$7~ z4oe(+uwSL`J(rv`2eN^6$l%%M#W|oqy<_YZ?^^?-ATOQ@A)@DE_9^q`vfltIA2JQ)h9?}19hLPTJ|HqY>4)h_az6#NPy`zTn3GO8iTulI{DP!m3WDjekt{-r3^!rM| z@eq4P7ZFkHC!ZHx&~iSf3VEEdViWWlbQOIt3i;|vpbf=+Kwm}~O7?<)qr?`>Jf<_XQ;uLI_N?q%&v`Lc1?2f_4X zCzjdCS!$`EUU-Fx&$+}sYkHu*tc$aZ^$E^CnM{9#W$l>kJhma&WdzeNVOf6!yNx{$=9#r3m^P*# zQ`fF<%1k~J!P&<2$^K0pQ{VKntbgZx2+TM2?7AkOVAr+#WqMh^1k;9KUzzNB1e51% zb6!2Wj&ly?>a1sgf16}}8{ps0cFx~+GI`Eu&iG@ecP~X%=6N33zp60b6sew5?0fUhSgL^>Dqh=c~yv4bha;Eg${fe?yLr4%Ce1#?@^( zJ}IMp2>s0U<#~=5^o0vA%pM91r?QgIs<|FbVp6G?+`9MS-&mjTOL`kXbE{$HAswNkOb-qwkTxymY1;awEhJdu& zZQ0JoYS~OeS|KzHk!5n&g63?$n342I0R+=h$Tnlwz-ybi8k!rbjc&ky9@k*1X+tl7W zGdbltF{-d?<6tjWVi6S}FiQ1yCI(y{0zYw2$)I%SSgZAvY5;ceTI#`jj}LQfVqFTG zJE~no0S$w+Ft9`&bc}*sY9-#jvZD-i278-DV&vIN7q+Chw=3OFM+%9sYS++AvW#^o zmMU`b;tr5)u7VqytnD#nD-cc*M$S}tGya<%A?vl#5o2vpr17QP+J9#zu24Ih9~0;&lL3r&D?K&yp)Jv-y-Tco8FY*RhbiXP(^@ z&Rzoh=mPGydlMP8yYlF?qXI6F7S%$e|JH|3j^r4$m*(8`L-@s$1Kj7C*(=R|eV~8* z05cV@Mp&oM)gIPxy^vFlPx|8Ha|gGMb)D!lhTH%@-bB+m=}rabppR$B40G~>ev)qi zJ;na<3?(sFHwB`g4NW{N7Qj^obK-M?TGSry2i_Srakh@>D-r8{ihCtJ8evT)mnW})8drTV7 zk3rPdqq#VJ$C6$%GB%$@T|9GX7EYY;1E1QBF7DZLX3mTEph^?x1?{<>j4sWOef)?; zA@ZfIy!f#XSSp=E7V;j^c#xTU+MwJI zXyCkd%ivAgnL38IB=CLEq-A|Fv5erX$1D3{GQUk-g8AFjCX;XKILn!w13T+1E9U~8S8lg8 zd8}jV*=Zjrrb_;ncdFW*7R$x%roVt{;Tw9+7XuZY1$A>8v^r>^AoAWph0b>^i26GuiO6-vqnu z%kJT2VE1LGw*kxgHR;=eWn(Q%-z6*?|5eiO0uc9zgSJ-SXf%=z7~0|i-3scF2T)1-k>lyyn8*G7~b8lV; z&)&WNfxP?v59FQuAIdL({!=hR)RF;XTCRXO2upr_UCO6rU0X&9B|R_IJ8II_Zgpfe z8Ngo8)J&Ed6GQAh1H{C@$UfVz$og7V1wqsTr2vr(N)e110}5bkC6}a7Yz9Ww4Tfi~ z+8{L7YJ%~Kg4t*ETChUu$BzEUhzkMy=97+s3NmkGrhfjYq!EvKr_|!2i7ZXFs7Xa9 z?le=Q_6h?jbS5H&*jaSYW@jW%PQm=8BI5SBgoe&X^`2^6(6?6vcwNDL(yZ0v3rMxv zP)$4Uv?Ke^4>Z8dwVSuG4=&kUO-lths^yrp_%z!kqkGyM$Z>muzQGvM1R3{5t)#uiNE)5KYJ&K{=y}oaV$2{K9tnV%V-#L8 za%52HFOhp)1v7Z>o!e@f=JNWbhW(;Rng@(Awbau%Wmdr{)wNTg>&8foy+!xk^ z!bWOK4nZ>(Zm$Xssok=+c|mHmstN+gu)Dx8*SiDU??{>PNWiVm{pXk;O$CWB>4;yo zSSToI(L9mr#K1W$voMfCZ#36HB5{mO4JDdm-rC7XAIF1c!y``+_ZXG_U?_F0E2Hg_ zmQl#V`^=;g8V!`%jzCr2x2?@B`Si0-rHXsKv=Wo;Y(xX43^1W6#!X=^6jBXZHEDqH z|ItrA6b93&VO^4-V@8O^;1`TAOVdu4Ghot~f)X&!`NFy!pMX}T!xF~6&Tt;e&AuGh zK`XOyaRK+kcm<$_S_ya(#QJkB;(j;IE457L!idXloY7n^DU}-Vv(}ebHo$Ol|n@Ng6r2SG9M50tcDVdAneEa&#Q1I34A*XxH8o<>|V_DL(<-HNxYyp z{RMqQ&M+*;u^3&j+4VV%2GHAWT^os z9v?U5<`(^aj%5pbNR7%V&IV1iNz;Ilpj~*5&>tMuFuJlKS>Qi4tjah)G+V7x(8cqI zdE<>t-o3hw`(eb}hz8w=$6``D+>;ibX$jzM) zDJ0~xfH*e5bCkXaIT!jZ?BVxGb1dmxO2(i8d~U7+-%`nl`hfjvx2klr+yVVTyBX*x z+fm?5;aSfcQyR=@>U1kWbMZ#2EsP{hxiVQ$34}pMHE= zm52ry31Ja2Kh)nSFz`%MwZHixq7S?o0Qcr@M)QuS#;G?H6VGI*^rr<}pqV`VuhI`J z_dgEWMBjRD5CUo~x7|~(MKiKEfrU^NWv6(i0l#s6 zBB2nTm!O?kmo}b-{P;s3pgF8Dg@k9?)I;oLM70FDmJB}91wEUB*3$Hy8neJ|;5qIG z_s05knW61jAA3cOQ<`T}3y{xIa1P?Zx>4Zm_4!rXkAgwIDU8r>5BzWmJb-Pf17$tra!xHQ`fGytgc<3$)1B<_cx}&@4DXoO{Phv zf!%>!&a`ZEm~XDma=Wc5x079Fw_DbJS(zD^V8-T^a9&$yxn0J@JX3DxzpNb-^SS9} zE_S|Y%ingn>CcpzWa=~7_4zmR2&SGXGr!N9gBgRsawdYQPgqvpBs2Dl>NDSN!@AD- zu%6wP$@I;{-=>^k=b3((=bQ(DdCs~7`^seZNicc#JYQ7LXAp#SH70f$){!s4Sy(_1ur_yY+R0#9SFQ2IvAWaWcnI|8S58rG6ppLB7@AA+UaZ}hbLvZxV2Hpa z7u7@$3>F!`2hWRYCe&_seru6~-zF?u|MLFb;5fe{6H?>dPfc) zf2zR<%4FEF7m-+07~p~$T-0cxi5IvGxo}}yX5AK;@iT1^Iw_|=M{1t5+5;7olqzj? zK2Jd}BdRvRH14dXBmlCea83eRr+UIJLvxz*7O3#sI>bMj`_vw^5B8Kkj`)>YnQIc48NqODN6+ff-kuD5Evc1GrP?0jo)_wjKNa!FlTu5DWFWED z6rj*-&4qoYu%8+=nMhFc;xd#9aOVC8@2kcqnfZ;?yqdbTK{KdvN^Kwz0~Oq;kF{Vx zP0}Ly6?yvXKsJ($IE_6Tj-=cg$!@hPYsoN}aG$Kkf~u)jZ1$y%_2k%vSV#jXa1K7~ zteSzNZwf0YPGXgQqW*MBQ+&FXOPZQUj^%dN!Uq4t-%Z$Mm);G7L zwEt9si=J#}!Yat2cGXdXnoMrl&P7#gFo3mT;Eq^0BvH(9|Jkl|S}i#^txFON@*K1> z=yL-<=`YeH?cNA`gSDSgyO}|chEi+x)W4=Xl9bEWugWhzf27)}^qn>aZdTByh5e;w z9DNDW#~1gr)WLq@ywLAh1?6en-)u|`Q;+)kY=YUZw1z4K&0vp4SSt!;@HVMF04W@& zkH`@CcLt0oSL;}-whA$}*H&Di)IU@#I@I^3_H$f#9Qv&4hbw#0*HfeO}vi(G$x zOrZJeYCMGdYD&G{kf#Slxp4UsX#GTerqNY|A9JK8Hzg+&w2|gBVkskG&vCW_(KP0Z zXASU%KIr18M}c&uGnS29T!Va27)mX$lkP+XKGggrouUA~F=poKc9P2>( zL~UCNXQ^Q}!lq`!)P5dI1M5}BIj0MUG0s{CIFJJF&Tu@FshB)JZD{}(Mx0*R*pi9M zD{j!g1ht@fs6bOsYYi0?(qAY)R8Zi>wGTxisww*LtA{eIRa9_W27c4^1JBq9w0zj_ zs!NDaET+QtwOkTsVkSxauD82fYCQjEDtM)Ekmm3m+yf|++`MyB>eW*`XS|pXo_oN5 zx??z~^^}%#{pnYb!AFQMjG9la?l|ssIOQ6+RY*)tV+yY+8!UH5vXa6(3-Y$sk{UJH z13KZyJ<+c#BZ>cVx2*m=V<@Y1r?R@aErWIw`!rTO;Xd{UjPg#wn@4^7G7m2{Dg>-m zYWlI1bdb*wJ`ZZ$k<2DjT{j9`xu?`Fr68R5-3E>0I}rtU6!0>#^{{{D+cJiC9%2iH zctbmNfYR%Eu3N6TBZW2oZQf^i55DMj~dgl5Pj{#T-BS$sfq}g^TFz z^?=%c*=$w?;>+GCUIypAi@XZ_Hrw)J2@?gMHZT1mc+)XWJJJ;UHxtJuUvJ8m)iH_n zY+#-NyB_;6$&{I^vmU|JwaYj!CW2kp22;;&XZo^%`Q~aT=lu}Qt84l+{WF;|dk%js zScu8Alid-)Sxzuzg!69DBvZ~S(|P4g2F#6{e3Mw8V6MzF{hD%NBxlyDpRI+x)ikc{OGBJWM|G4A^xE&ant=Z_kIYte%}`>O1FS z|0dXZc6!xz&Ur1XW0x%(i^+ifH-W#G^4vS@ZvR{_XwJaFGAsEO!UVUk0rzp=9VwapFMacYb#)G&~6yE9x!uY zXg%J5RLfNrf<%A|bC+A%&8~Pu0hxfIrB5Y3^|p34$Wm+Tr+ATQZPwj7zJ<)7=aTZ#cE5cSeLD>Rq>~?lE~$y+iFMw>$SkW zGSIQ`;A0hm2T9WAVHN)Tm}(Le>49Os}!pJrnf z+PlCslR>0;n&0P_F3oV))}{FDiG*BW6wx;s<2aa0YR6Dc^|aiT7#Qu<1S917WWA7- z3f89zCelq=0GQ|k=0Lo8cv6!L_J9ujCyk1f%N5xzRi&_!Q(ul_s`0rnW;Q9OjgB(C z6x8-XSLmPewAz%rw=c=S9hN56(1m-Tc2g!2k|QwUwf0C(Xkv-oNCtfx88n!Tt0p8h z9ci{r?cg5nl^Qc-mf!!udorB+)!aSgrX~=WH?Lpzj?38d5qiQHUz@QpqBR9=IYxgj z79~9C%c5Q7%Z+N(eR0r~E9)s)XK)kDi-M|!KcJ@UBh=YgNorJT3VtZ;bYuNj)98Cl z+S!-qSRb0rQ2>^SM^)pQnunEILm0V}drNq-qa>Zlbd{K4N8npInjn(LPl)?$o3N�WjA7L8N2R9Z*EUoDLZKV| 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

lmntgq+*vvWC@I|CQrr6MoVZIWSG$jX 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

EV5vpUGQlHa8@hMb#Pzny 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�KCu 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®ukr=asd{{?yj=x3nRsJ;N@=x7h< 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

%9cNVxl!c7Nv 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℞b_9b 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%0ACT!PHTH|K%cdRb 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 @X67yyjlPb4XsjhmEu=G(*M>e;* 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 z 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%0AVD@!RK;re)7e*(%};=8!AgJ3)8 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�mT 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%0D=(75MW=c8loGozpQF}dAhVQ_TGf0QGj9`r) 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≈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%0DNe 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

c*Wz3*4(Cc>8DIibc2|c? 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%0A@J=Dr3QC4dYg=dW`QFGp*f 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 MvdJSVc!cr)1N^GvDgXcg literal 0 HcmV?d00001 diff --git a/NothinFancy/dep/lib/glew32s.lib b/NothinFancy/dep/lib/glew32s.lib new file mode 100644 index 0000000000000000000000000000000000000000..2e46b7bf7c5bfeaad94a5bc53d9881065778d283 GIT binary patch literal 2443636 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

  • P#&Yh@gM(12s3}4DQQR`Se-X9@W2kUo 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 WWG?pZxC*na0@JzV!-T+n_iL%t+<-1K|hP4((w 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�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

    Jt%VLqS_=%*T40zuwvBX*<0c|!Ef8fh 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

  • L_I1=Aq`q?Zs=bV%s8?Dulchl4s#nFJ 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 * deltaTime); } - float offset = 0.5f; - if (app->isKeyHeld(NFI_UP)) - yrot += offset; - if (app->isKeyHeld(NFI_DOWN)) - yrot -= offset; - if (app->isKeyHeld(NFI_LEFT)) - xrot += offset; - if (app->isKeyHeld(NFI_RIGHT)) - xrot -= offset; - light.setPosition(nf::Vec3(0.0, yrot / 20.0 + 5.0, 0.0)); + light.setPosition(nf::Vec3(std::sin(circle) * 10.0, 5.0, std::cos(circle) * 10.0)); + circle += 2.0 * deltaTime; text.setText("FPS: " + std::to_string(app->getFPS())); @@ -92,7 +84,7 @@ void MainState::render(nf::Renderer& renderer) { void MainState::onExit() { Log("MainState onExit!"); - xrot = yrot = 0.0f; + circle = 0.0; entities.clear(); } \ No newline at end of file diff --git a/Game/src/include/MainState.h b/Game/src/include/MainState.h index 3febb4d..31c3962 100644 --- a/Game/src/include/MainState.h +++ b/Game/src/include/MainState.h @@ -24,7 +24,7 @@ private: nf::Sound sound; - float xrot, yrot; + double circle; std::vector entities; }; \ No newline at end of file diff --git a/NFPackCreator/AssetBuild/base/shaders/lightingFragment.shader b/NFPackCreator/AssetBuild/base/shaders/lightingFragment.shader index 89981db..c8fb78e 100644 --- a/NFPackCreator/AssetBuild/base/shaders/lightingFragment.shader +++ b/NFPackCreator/AssetBuild/base/shaders/lightingFragment.shader @@ -77,35 +77,16 @@ float calcShadowPoint(int lightNum, vec3 no, vec3 lDir, vec3 fp) { } void main() { + vec3 specTemp = texture(gBSpec, texCoord).rgb; + if (specTemp.b != 1.0) + discard; vec3 color = vec3(0.0); vec3 fragPos = texture(gBPos, texCoord).xyz; vec3 norm = texture(gBNorm, texCoord).xyz; vec3 matDiff = texture(gBDiff, texCoord).rgb; - vec3 specTemp = texture(gBSpec, texCoord).rgb; float specPower = specTemp.r; float matSpec = specTemp.g; - if (specTemp.b != 1.0) - discard; - - /*vec3 matDiff; - if (material.hasDiffuseTex) - matDiff = texture(material.diffuseTexture, texCoord).rgb; - else - matDiff = material.diffuseColor; - - vec3 matSpec = vec3(1.0); - if (material.hasSpecTex) - matSpec = texture(material.specularTexture, texCoord).rgb; - - vec3 norm; - if (material.hasNormTex) { - norm = texture(material.normalTexture, texCoord).rgb; - norm = normalize(norm * 2.0 - 1.0); - } - else { - norm = normalize(normals); - }*/ float ambientStrength = 0.1f; vec3 ambient = ambientStrength * matDiff; diff --git a/NFPackCreator/AssetBuild/example/models/normal.mtl b/NFPackCreator/AssetBuild/example/models/normal.mtl index 982ddec..d9ba1d3 100644 --- a/NFPackCreator/AssetBuild/example/models/normal.mtl +++ b/NFPackCreator/AssetBuild/example/models/normal.mtl @@ -2,7 +2,7 @@ # Material Count: 1 newmtl mat -Ns 225.000000 +Ns 100.000000 Ka 1.000000 1.000000 1.000000 Kd 0.800000 0.800000 0.800000 Ks 0.500000 0.500000 0.500000 diff --git a/NothinFancy/dep/include/GL/eglew.h b/NothinFancy/dep/include/GL/eglew.h new file mode 100644 index 0000000..4670147 --- /dev/null +++ b/NothinFancy/dep/include/GL/eglew.h @@ -0,0 +1,2618 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** 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 __eglew_h__ +#define __eglew_h__ +#define __EGLEW_H__ + +#ifdef __eglext_h_ +#error eglext.h included before eglew.h +#endif + +#if defined(__egl_h_) +#error egl.h included before eglew.h +#endif + +#define __eglext_h_ + +#define __egl_h_ + +#ifndef EGLAPIENTRY +#define EGLAPIENTRY +#endif +#ifndef EGLAPI +#define EGLAPI extern +#endif + +/* EGL Types */ +#include + +#include +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef int32_t EGLint; + +typedef unsigned int EGLBoolean; +typedef void *EGLDisplay; +typedef void *EGLConfig; +typedef void *EGLSurface; +typedef void *EGLContext; +typedef void (*__eglMustCastToProperFunctionPointerType)(void); + +typedef unsigned int EGLenum; +typedef void *EGLClientBuffer; + +typedef void *EGLSync; +typedef intptr_t EGLAttrib; +typedef khronos_utime_nanoseconds_t EGLTime; +typedef void *EGLImage; + +typedef void *EGLSyncKHR; +typedef intptr_t EGLAttribKHR; +typedef void *EGLLabelKHR; +typedef void *EGLObjectKHR; +typedef void (EGLAPIENTRY *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); +typedef khronos_utime_nanoseconds_t EGLTimeKHR; +typedef void *EGLImageKHR; +typedef void *EGLStreamKHR; +typedef khronos_uint64_t EGLuint64KHR; +typedef int EGLNativeFileDescriptorKHR; +typedef khronos_ssize_t EGLsizeiANDROID; +typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); +typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); +typedef void *EGLDeviceEXT; +typedef void *EGLOutputLayerEXT; +typedef void *EGLOutputPortEXT; +typedef void *EGLSyncNV; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +typedef khronos_utime_nanoseconds_t EGLuint64NV; +typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; + +struct EGLClientPixmapHI; + +#define EGL_DONT_CARE ((EGLint)-1) + +#define EGL_NO_CONTEXT ((EGLContext)0) +#define EGL_NO_DISPLAY ((EGLDisplay)0) +#define EGL_NO_IMAGE ((EGLImage)0) +#define EGL_NO_SURFACE ((EGLSurface)0) +#define EGL_NO_SYNC ((EGLSync)0) + +#define EGL_UNKNOWN ((EGLint)-1) + +#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) + +EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); +/* ---------------------------- EGL_VERSION_1_0 ---------------------------- */ + +#ifndef EGL_VERSION_1_0 +#define EGL_VERSION_1_0 1 + +#define EGL_FALSE 0 +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_TRUE 1 +#define EGL_PIXMAP_BIT 0x0002 +#define EGL_WINDOW_BIT 0x0004 +#define EGL_SUCCESS 0x3000 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BLUE_SIZE 0x3022 +#define EGL_GREEN_SIZE 0x3023 +#define EGL_RED_SIZE 0x3024 +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_LEVEL 0x3029 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_NONE 0x3038 +#define EGL_SLOW_CONFIG 0x3050 +#define EGL_NON_CONFORMANT_CONFIG 0x3051 +#define EGL_TRANSPARENT_RGB 0x3052 +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_EXTENSIONS 0x3055 +#define EGL_HEIGHT 0x3056 +#define EGL_WIDTH 0x3057 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_DRAW 0x3059 +#define EGL_READ 0x305A +#define EGL_CORE_NATIVE_ENGINE 0x305B + +typedef EGLBoolean ( * PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint * attrib_list, EGLConfig * configs, EGLint config_size, EGLint * num_config); +typedef EGLBoolean ( * PFNEGLCOPYBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +typedef EGLContext ( * PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig config, const EGLint * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx); +typedef EGLBoolean ( * PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean ( * PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint * value); +typedef EGLBoolean ( * PFNEGLGETCONFIGSPROC) (EGLDisplay dpy, EGLConfig * configs, EGLint config_size, EGLint * num_config); +typedef EGLDisplay ( * PFNEGLGETCURRENTDISPLAYPROC) ( void ); +typedef EGLSurface ( * PFNEGLGETCURRENTSURFACEPROC) (EGLint readdraw); +typedef EGLDisplay ( * PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id); +typedef EGLint ( * PFNEGLGETERRORPROC) ( void ); +typedef EGLBoolean ( * PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint * major, EGLint * minor); +typedef EGLBoolean ( * PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +typedef EGLBoolean ( * PFNEGLQUERYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint * value); +typedef const char * ( * PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name); +typedef EGLBoolean ( * PFNEGLQUERYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint * value); +typedef EGLBoolean ( * PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean ( * PFNEGLTERMINATEPROC) (EGLDisplay dpy); +typedef EGLBoolean ( * PFNEGLWAITGLPROC) ( void ); +typedef EGLBoolean ( * PFNEGLWAITNATIVEPROC) (EGLint engine); + +#define eglChooseConfig EGLEW_GET_FUN(__eglewChooseConfig) +#define eglCopyBuffers EGLEW_GET_FUN(__eglewCopyBuffers) +#define eglCreateContext EGLEW_GET_FUN(__eglewCreateContext) +#define eglCreatePbufferSurface EGLEW_GET_FUN(__eglewCreatePbufferSurface) +#define eglCreatePixmapSurface EGLEW_GET_FUN(__eglewCreatePixmapSurface) +#define eglCreateWindowSurface EGLEW_GET_FUN(__eglewCreateWindowSurface) +#define eglDestroyContext EGLEW_GET_FUN(__eglewDestroyContext) +#define eglDestroySurface EGLEW_GET_FUN(__eglewDestroySurface) +#define eglGetConfigAttrib EGLEW_GET_FUN(__eglewGetConfigAttrib) +#define eglGetConfigs EGLEW_GET_FUN(__eglewGetConfigs) +#define eglGetCurrentDisplay EGLEW_GET_FUN(__eglewGetCurrentDisplay) +#define eglGetCurrentSurface EGLEW_GET_FUN(__eglewGetCurrentSurface) +#define eglGetDisplay EGLEW_GET_FUN(__eglewGetDisplay) +#define eglGetError EGLEW_GET_FUN(__eglewGetError) +#define eglInitialize EGLEW_GET_FUN(__eglewInitialize) +#define eglMakeCurrent EGLEW_GET_FUN(__eglewMakeCurrent) +#define eglQueryContext EGLEW_GET_FUN(__eglewQueryContext) +#define eglQueryString EGLEW_GET_FUN(__eglewQueryString) +#define eglQuerySurface EGLEW_GET_FUN(__eglewQuerySurface) +#define eglSwapBuffers EGLEW_GET_FUN(__eglewSwapBuffers) +#define eglTerminate EGLEW_GET_FUN(__eglewTerminate) +#define eglWaitGL EGLEW_GET_FUN(__eglewWaitGL) +#define eglWaitNative EGLEW_GET_FUN(__eglewWaitNative) + +#define EGLEW_VERSION_1_0 EGLEW_GET_VAR(__EGLEW_VERSION_1_0) + +#endif /* EGL_VERSION_1_0 */ + +/* ---------------------------- EGL_VERSION_1_1 ---------------------------- */ + +#ifndef EGL_VERSION_1_1 +#define EGL_VERSION_1_1 1 + +#define EGL_CONTEXT_LOST 0x300E +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_NO_TEXTURE 0x305C +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_2D 0x305F +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_TARGET 0x3081 +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_BACK_BUFFER 0x3084 + +typedef EGLBoolean ( * PFNEGLBINDTEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean ( * PFNEGLRELEASETEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean ( * PFNEGLSURFACEATTRIBPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +typedef EGLBoolean ( * PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval); + +#define eglBindTexImage EGLEW_GET_FUN(__eglewBindTexImage) +#define eglReleaseTexImage EGLEW_GET_FUN(__eglewReleaseTexImage) +#define eglSurfaceAttrib EGLEW_GET_FUN(__eglewSurfaceAttrib) +#define eglSwapInterval EGLEW_GET_FUN(__eglewSwapInterval) + +#define EGLEW_VERSION_1_1 EGLEW_GET_VAR(__EGLEW_VERSION_1_1) + +#endif /* EGL_VERSION_1_1 */ + +/* ---------------------------- EGL_VERSION_1_2 ---------------------------- */ + +#ifndef EGL_VERSION_1_2 +#define EGL_VERSION_1_2 1 + +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENVG_BIT 0x0002 +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_SINGLE_BUFFER 0x3085 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_COLORSPACE 0x3087 +#define EGL_ALPHA_FORMAT 0x3088 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_ALPHA_FORMAT_PRE 0x308C +#define EGL_CLIENT_APIS 0x308D +#define EGL_RGB_BUFFER 0x308E +#define EGL_LUMINANCE_BUFFER 0x308F +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_VERTICAL_RESOLUTION 0x3091 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_BUFFER_PRESERVED 0x3094 +#define EGL_BUFFER_DESTROYED 0x3095 +#define EGL_OPENVG_IMAGE 0x3096 +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENVG_API 0x30A1 +#define EGL_DISPLAY_SCALING 10000 + +typedef EGLBoolean ( * PFNEGLBINDAPIPROC) (EGLenum api); +typedef EGLSurface ( * PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint * attrib_list); +typedef EGLenum ( * PFNEGLQUERYAPIPROC) ( void ); +typedef EGLBoolean ( * PFNEGLRELEASETHREADPROC) ( void ); +typedef EGLBoolean ( * PFNEGLWAITCLIENTPROC) ( void ); + +#define eglBindAPI EGLEW_GET_FUN(__eglewBindAPI) +#define eglCreatePbufferFromClientBuffer EGLEW_GET_FUN(__eglewCreatePbufferFromClientBuffer) +#define eglQueryAPI EGLEW_GET_FUN(__eglewQueryAPI) +#define eglReleaseThread EGLEW_GET_FUN(__eglewReleaseThread) +#define eglWaitClient EGLEW_GET_FUN(__eglewWaitClient) + +#define EGLEW_VERSION_1_2 EGLEW_GET_VAR(__EGLEW_VERSION_1_2) + +#endif /* EGL_VERSION_1_2 */ + +/* ---------------------------- EGL_VERSION_1_3 ---------------------------- */ + +#ifndef EGL_VERSION_1_3 +#define EGL_VERSION_1_3 1 + +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 +#define EGL_CONFORMANT 0x3042 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_VG_COLORSPACE_LINEAR 0x308A +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 + +#define EGLEW_VERSION_1_3 EGLEW_GET_VAR(__EGLEW_VERSION_1_3) + +#endif /* EGL_VERSION_1_3 */ + +/* ---------------------------- EGL_VERSION_1_4 ---------------------------- */ + +#ifndef EGL_VERSION_1_4 +#define EGL_VERSION_1_4 1 + +#define EGL_OPENGL_BIT 0x0008 +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B +#define EGL_OPENGL_API 0x30A2 + +typedef EGLContext ( * PFNEGLGETCURRENTCONTEXTPROC) ( void ); + +#define eglGetCurrentContext EGLEW_GET_FUN(__eglewGetCurrentContext) + +#define EGLEW_VERSION_1_4 EGLEW_GET_VAR(__EGLEW_VERSION_1_4) + +#endif /* EGL_VERSION_1_4 */ + +/* ---------------------------- EGL_VERSION_1_5 ---------------------------- */ + +#ifndef EGL_VERSION_1_5 +#define EGL_VERSION_1_5 1 + +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 +#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_GL_COLORSPACE_SRGB 0x3089 +#define EGL_GL_COLORSPACE_LINEAR 0x308A +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CL_EVENT_HANDLE 0x309C +#define EGL_GL_COLORSPACE 0x309D +#define EGL_GL_TEXTURE_2D 0x30B1 +#define EGL_GL_TEXTURE_3D 0x30B2 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 +#define EGL_GL_RENDERBUFFER 0x30B9 +#define EGL_GL_TEXTURE_LEVEL 0x30BC +#define EGL_GL_TEXTURE_ZOFFSET 0x30BD +#define EGL_IMAGE_PRESERVED 0x30D2 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 +#define EGL_SYNC_STATUS 0x30F1 +#define EGL_SIGNALED 0x30F2 +#define EGL_UNSIGNALED 0x30F3 +#define EGL_TIMEOUT_EXPIRED 0x30F5 +#define EGL_CONDITION_SATISFIED 0x30F6 +#define EGL_SYNC_TYPE 0x30F7 +#define EGL_SYNC_CONDITION 0x30F8 +#define EGL_SYNC_FENCE 0x30F9 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB +#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD +#define EGL_SYNC_CL_EVENT 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF +#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD +#define EGL_NO_RESET_NOTIFICATION 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF +#define EGL_FOREVER 0xFFFFFFFFFFFFFFFF + +typedef EGLint ( * PFNEGLCLIENTWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); +typedef EGLImage ( * PFNEGLCREATEIMAGEPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLAttrib * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void * native_window, const EGLAttrib * attrib_list); +typedef EGLSync ( * PFNEGLCREATESYNCPROC) (EGLDisplay dpy, EGLenum type, const EGLAttrib * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYIMAGEPROC) (EGLDisplay dpy, EGLImage image); +typedef EGLBoolean ( * PFNEGLDESTROYSYNCPROC) (EGLDisplay dpy, EGLSync sync); +typedef EGLDisplay ( * PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void * native_display, const EGLAttrib * attrib_list); +typedef EGLBoolean ( * PFNEGLGETSYNCATTRIBPROC) (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib * value); +typedef EGLBoolean ( * PFNEGLWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags); + +#define eglClientWaitSync EGLEW_GET_FUN(__eglewClientWaitSync) +#define eglCreateImage EGLEW_GET_FUN(__eglewCreateImage) +#define eglCreatePlatformPixmapSurface EGLEW_GET_FUN(__eglewCreatePlatformPixmapSurface) +#define eglCreatePlatformWindowSurface EGLEW_GET_FUN(__eglewCreatePlatformWindowSurface) +#define eglCreateSync EGLEW_GET_FUN(__eglewCreateSync) +#define eglDestroyImage EGLEW_GET_FUN(__eglewDestroyImage) +#define eglDestroySync EGLEW_GET_FUN(__eglewDestroySync) +#define eglGetPlatformDisplay EGLEW_GET_FUN(__eglewGetPlatformDisplay) +#define eglGetSyncAttrib EGLEW_GET_FUN(__eglewGetSyncAttrib) +#define eglWaitSync EGLEW_GET_FUN(__eglewWaitSync) + +#define EGLEW_VERSION_1_5 EGLEW_GET_VAR(__EGLEW_VERSION_1_5) + +#endif /* EGL_VERSION_1_5 */ + +/* ------------------------- EGL_ANDROID_blob_cache ------------------------ */ + +#ifndef EGL_ANDROID_blob_cache +#define EGL_ANDROID_blob_cache 1 + +typedef void ( * PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); + +#define eglSetBlobCacheFuncsANDROID EGLEW_GET_FUN(__eglewSetBlobCacheFuncsANDROID) + +#define EGLEW_ANDROID_blob_cache EGLEW_GET_VAR(__EGLEW_ANDROID_blob_cache) + +#endif /* EGL_ANDROID_blob_cache */ + +/* ---------------- EGL_ANDROID_create_native_client_buffer ---------------- */ + +#ifndef EGL_ANDROID_create_native_client_buffer +#define EGL_ANDROID_create_native_client_buffer 1 + +#define EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID 0x00000001 +#define EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID 0x00000002 +#define EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID 0x00000004 +#define EGL_NATIVE_BUFFER_USAGE_ANDROID 0x3143 + +typedef EGLClientBuffer ( * PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC) (const EGLint * attrib_list); + +#define eglCreateNativeClientBufferANDROID EGLEW_GET_FUN(__eglewCreateNativeClientBufferANDROID) + +#define EGLEW_ANDROID_create_native_client_buffer EGLEW_GET_VAR(__EGLEW_ANDROID_create_native_client_buffer) + +#endif /* EGL_ANDROID_create_native_client_buffer */ + +/* --------------------- EGL_ANDROID_framebuffer_target -------------------- */ + +#ifndef EGL_ANDROID_framebuffer_target +#define EGL_ANDROID_framebuffer_target 1 + +#define EGL_FRAMEBUFFER_TARGET_ANDROID 0x3147 + +#define EGLEW_ANDROID_framebuffer_target EGLEW_GET_VAR(__EGLEW_ANDROID_framebuffer_target) + +#endif /* EGL_ANDROID_framebuffer_target */ + +/* ----------------- EGL_ANDROID_front_buffer_auto_refresh ----------------- */ + +#ifndef EGL_ANDROID_front_buffer_auto_refresh +#define EGL_ANDROID_front_buffer_auto_refresh 1 + +#define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID 0x314C + +#define EGLEW_ANDROID_front_buffer_auto_refresh EGLEW_GET_VAR(__EGLEW_ANDROID_front_buffer_auto_refresh) + +#endif /* EGL_ANDROID_front_buffer_auto_refresh */ + +/* -------------------- EGL_ANDROID_image_native_buffer -------------------- */ + +#ifndef EGL_ANDROID_image_native_buffer +#define EGL_ANDROID_image_native_buffer 1 + +#define EGL_NATIVE_BUFFER_ANDROID 0x3140 + +#define EGLEW_ANDROID_image_native_buffer EGLEW_GET_VAR(__EGLEW_ANDROID_image_native_buffer) + +#endif /* EGL_ANDROID_image_native_buffer */ + +/* --------------------- EGL_ANDROID_native_fence_sync --------------------- */ + +#ifndef EGL_ANDROID_native_fence_sync +#define EGL_ANDROID_native_fence_sync 1 + +#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144 +#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145 +#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146 + +typedef EGLint ( * PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync); + +#define eglDupNativeFenceFDANDROID EGLEW_GET_FUN(__eglewDupNativeFenceFDANDROID) + +#define EGLEW_ANDROID_native_fence_sync EGLEW_GET_VAR(__EGLEW_ANDROID_native_fence_sync) + +#endif /* EGL_ANDROID_native_fence_sync */ + +/* --------------------- EGL_ANDROID_presentation_time --------------------- */ + +#ifndef EGL_ANDROID_presentation_time +#define EGL_ANDROID_presentation_time 1 + +typedef EGLBoolean ( * PFNEGLPRESENTATIONTIMEANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); + +#define eglPresentationTimeANDROID EGLEW_GET_FUN(__eglewPresentationTimeANDROID) + +#define EGLEW_ANDROID_presentation_time EGLEW_GET_VAR(__EGLEW_ANDROID_presentation_time) + +#endif /* EGL_ANDROID_presentation_time */ + +/* ------------------------- EGL_ANDROID_recordable ------------------------ */ + +#ifndef EGL_ANDROID_recordable +#define EGL_ANDROID_recordable 1 + +#define EGL_RECORDABLE_ANDROID 0x3142 + +#define EGLEW_ANDROID_recordable EGLEW_GET_VAR(__EGLEW_ANDROID_recordable) + +#endif /* EGL_ANDROID_recordable */ + +/* ---------------- EGL_ANGLE_d3d_share_handle_client_buffer --------------- */ + +#ifndef EGL_ANGLE_d3d_share_handle_client_buffer +#define EGL_ANGLE_d3d_share_handle_client_buffer 1 + +#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 + +#define EGLEW_ANGLE_d3d_share_handle_client_buffer EGLEW_GET_VAR(__EGLEW_ANGLE_d3d_share_handle_client_buffer) + +#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ + +/* -------------------------- EGL_ANGLE_device_d3d ------------------------- */ + +#ifndef EGL_ANGLE_device_d3d +#define EGL_ANGLE_device_d3d 1 + +#define EGL_D3D9_DEVICE_ANGLE 0x33A0 +#define EGL_D3D11_DEVICE_ANGLE 0x33A1 + +#define EGLEW_ANGLE_device_d3d EGLEW_GET_VAR(__EGLEW_ANGLE_device_d3d) + +#endif /* EGL_ANGLE_device_d3d */ + +/* -------------------- EGL_ANGLE_query_surface_pointer -------------------- */ + +#ifndef EGL_ANGLE_query_surface_pointer +#define EGL_ANGLE_query_surface_pointer 1 + +typedef EGLBoolean ( * PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void ** value); + +#define eglQuerySurfacePointerANGLE EGLEW_GET_FUN(__eglewQuerySurfacePointerANGLE) + +#define EGLEW_ANGLE_query_surface_pointer EGLEW_GET_VAR(__EGLEW_ANGLE_query_surface_pointer) + +#endif /* EGL_ANGLE_query_surface_pointer */ + +/* ------------- EGL_ANGLE_surface_d3d_texture_2d_share_handle ------------- */ + +#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle +#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 + +#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 + +#define EGLEW_ANGLE_surface_d3d_texture_2d_share_handle EGLEW_GET_VAR(__EGLEW_ANGLE_surface_d3d_texture_2d_share_handle) + +#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ + +/* ---------------------- EGL_ANGLE_window_fixed_size ---------------------- */ + +#ifndef EGL_ANGLE_window_fixed_size +#define EGL_ANGLE_window_fixed_size 1 + +#define EGL_FIXED_SIZE_ANGLE 0x3201 + +#define EGLEW_ANGLE_window_fixed_size EGLEW_GET_VAR(__EGLEW_ANGLE_window_fixed_size) + +#endif /* EGL_ANGLE_window_fixed_size */ + +/* --------------------- EGL_ARM_implicit_external_sync -------------------- */ + +#ifndef EGL_ARM_implicit_external_sync +#define EGL_ARM_implicit_external_sync 1 + +#define EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM 0x328A + +#define EGLEW_ARM_implicit_external_sync EGLEW_GET_VAR(__EGLEW_ARM_implicit_external_sync) + +#endif /* EGL_ARM_implicit_external_sync */ + +/* ------------------- EGL_ARM_pixmap_multisample_discard ------------------ */ + +#ifndef EGL_ARM_pixmap_multisample_discard +#define EGL_ARM_pixmap_multisample_discard 1 + +#define EGL_DISCARD_SAMPLES_ARM 0x3286 + +#define EGLEW_ARM_pixmap_multisample_discard EGLEW_GET_VAR(__EGLEW_ARM_pixmap_multisample_discard) + +#endif /* EGL_ARM_pixmap_multisample_discard */ + +/* --------------------------- EGL_EXT_buffer_age -------------------------- */ + +#ifndef EGL_EXT_buffer_age +#define EGL_EXT_buffer_age 1 + +#define EGL_BUFFER_AGE_EXT 0x313D + +#define EGLEW_EXT_buffer_age EGLEW_GET_VAR(__EGLEW_EXT_buffer_age) + +#endif /* EGL_EXT_buffer_age */ + +/* ----------------------- EGL_EXT_client_extensions ----------------------- */ + +#ifndef EGL_EXT_client_extensions +#define EGL_EXT_client_extensions 1 + +#define EGLEW_EXT_client_extensions EGLEW_GET_VAR(__EGLEW_EXT_client_extensions) + +#endif /* EGL_EXT_client_extensions */ + +/* ------------------- EGL_EXT_create_context_robustness ------------------- */ + +#ifndef EGL_EXT_create_context_robustness +#define EGL_EXT_create_context_robustness 1 + +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138 +#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF + +#define EGLEW_EXT_create_context_robustness EGLEW_GET_VAR(__EGLEW_EXT_create_context_robustness) + +#endif /* EGL_EXT_create_context_robustness */ + +/* -------------------------- EGL_EXT_device_base -------------------------- */ + +#ifndef EGL_EXT_device_base +#define EGL_EXT_device_base 1 + +#define EGL_BAD_DEVICE_EXT 0x322B +#define EGL_DEVICE_EXT 0x322C + +#define EGLEW_EXT_device_base EGLEW_GET_VAR(__EGLEW_EXT_device_base) + +#endif /* EGL_EXT_device_base */ + +/* --------------------------- EGL_EXT_device_drm -------------------------- */ + +#ifndef EGL_EXT_device_drm +#define EGL_EXT_device_drm 1 + +#define EGL_DRM_DEVICE_FILE_EXT 0x3233 + +#define EGLEW_EXT_device_drm EGLEW_GET_VAR(__EGLEW_EXT_device_drm) + +#endif /* EGL_EXT_device_drm */ + +/* ----------------------- EGL_EXT_device_enumeration ---------------------- */ + +#ifndef EGL_EXT_device_enumeration +#define EGL_EXT_device_enumeration 1 + +typedef EGLBoolean ( * PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT * devices, EGLint * num_devices); + +#define eglQueryDevicesEXT EGLEW_GET_FUN(__eglewQueryDevicesEXT) + +#define EGLEW_EXT_device_enumeration EGLEW_GET_VAR(__EGLEW_EXT_device_enumeration) + +#endif /* EGL_EXT_device_enumeration */ + +/* ------------------------- EGL_EXT_device_openwf ------------------------- */ + +#ifndef EGL_EXT_device_openwf +#define EGL_EXT_device_openwf 1 + +#define EGL_OPENWF_DEVICE_ID_EXT 0x3237 + +#define EGLEW_EXT_device_openwf EGLEW_GET_VAR(__EGLEW_EXT_device_openwf) + +#endif /* EGL_EXT_device_openwf */ + +/* -------------------------- EGL_EXT_device_query ------------------------- */ + +#ifndef EGL_EXT_device_query +#define EGL_EXT_device_query 1 + +#define EGL_BAD_DEVICE_EXT 0x322B +#define EGL_DEVICE_EXT 0x322C + +typedef EGLBoolean ( * PFNEGLQUERYDEVICEATTRIBEXTPROC) (EGLDeviceEXT device, EGLint attribute, EGLAttrib * value); +typedef const char * ( * PFNEGLQUERYDEVICESTRINGEXTPROC) (EGLDeviceEXT device, EGLint name); +typedef EGLBoolean ( * PFNEGLQUERYDISPLAYATTRIBEXTPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib * value); + +#define eglQueryDeviceAttribEXT EGLEW_GET_FUN(__eglewQueryDeviceAttribEXT) +#define eglQueryDeviceStringEXT EGLEW_GET_FUN(__eglewQueryDeviceStringEXT) +#define eglQueryDisplayAttribEXT EGLEW_GET_FUN(__eglewQueryDisplayAttribEXT) + +#define EGLEW_EXT_device_query EGLEW_GET_VAR(__EGLEW_EXT_device_query) + +#endif /* EGL_EXT_device_query */ + +/* ------------------ EGL_EXT_gl_colorspace_bt2020_linear ------------------ */ + +#ifndef EGL_EXT_gl_colorspace_bt2020_linear +#define EGL_EXT_gl_colorspace_bt2020_linear 1 + +#define EGL_GL_COLORSPACE_BT2020_LINEAR_EXT 0x333F + +#define EGLEW_EXT_gl_colorspace_bt2020_linear EGLEW_GET_VAR(__EGLEW_EXT_gl_colorspace_bt2020_linear) + +#endif /* EGL_EXT_gl_colorspace_bt2020_linear */ + +/* -------------------- EGL_EXT_gl_colorspace_bt2020_pq -------------------- */ + +#ifndef EGL_EXT_gl_colorspace_bt2020_pq +#define EGL_EXT_gl_colorspace_bt2020_pq 1 + +#define EGL_GL_COLORSPACE_BT2020_PQ_EXT 0x3340 + +#define EGLEW_EXT_gl_colorspace_bt2020_pq EGLEW_GET_VAR(__EGLEW_EXT_gl_colorspace_bt2020_pq) + +#endif /* EGL_EXT_gl_colorspace_bt2020_pq */ + +/* ------------------- EGL_EXT_gl_colorspace_scrgb_linear ------------------ */ + +#ifndef EGL_EXT_gl_colorspace_scrgb_linear +#define EGL_EXT_gl_colorspace_scrgb_linear 1 + +#define EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT 0x3350 + +#define EGLEW_EXT_gl_colorspace_scrgb_linear EGLEW_GET_VAR(__EGLEW_EXT_gl_colorspace_scrgb_linear) + +#endif /* EGL_EXT_gl_colorspace_scrgb_linear */ + +/* ---------------------- EGL_EXT_image_dma_buf_import --------------------- */ + +#ifndef EGL_EXT_image_dma_buf_import +#define EGL_EXT_image_dma_buf_import 1 + +#define EGL_LINUX_DMA_BUF_EXT 0x3270 +#define EGL_LINUX_DRM_FOURCC_EXT 0x3271 +#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272 +#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273 +#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274 +#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275 +#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276 +#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277 +#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278 +#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279 +#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A +#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B +#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C +#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D +#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E +#define EGL_ITU_REC601_EXT 0x327F +#define EGL_ITU_REC709_EXT 0x3280 +#define EGL_ITU_REC2020_EXT 0x3281 +#define EGL_YUV_FULL_RANGE_EXT 0x3282 +#define EGL_YUV_NARROW_RANGE_EXT 0x3283 +#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284 +#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285 + +#define EGLEW_EXT_image_dma_buf_import EGLEW_GET_VAR(__EGLEW_EXT_image_dma_buf_import) + +#endif /* EGL_EXT_image_dma_buf_import */ + +/* ----------------- EGL_EXT_image_dma_buf_import_modifiers ---------------- */ + +#ifndef EGL_EXT_image_dma_buf_import_modifiers +#define EGL_EXT_image_dma_buf_import_modifiers 1 + +#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440 +#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441 +#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442 +#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443 +#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444 +#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445 +#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446 +#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447 +#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448 +#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449 +#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A + +typedef EGLBoolean ( * PFNEGLQUERYDMABUFFORMATSEXTPROC) (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats); +typedef EGLBoolean ( * PFNEGLQUERYDMABUFMODIFIERSEXTPROC) (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers); + +#define eglQueryDmaBufFormatsEXT EGLEW_GET_FUN(__eglewQueryDmaBufFormatsEXT) +#define eglQueryDmaBufModifiersEXT EGLEW_GET_FUN(__eglewQueryDmaBufModifiersEXT) + +#define EGLEW_EXT_image_dma_buf_import_modifiers EGLEW_GET_VAR(__EGLEW_EXT_image_dma_buf_import_modifiers) + +#endif /* EGL_EXT_image_dma_buf_import_modifiers */ + +/* ------------------------ EGL_EXT_multiview_window ----------------------- */ + +#ifndef EGL_EXT_multiview_window +#define EGL_EXT_multiview_window 1 + +#define EGL_MULTIVIEW_VIEW_COUNT_EXT 0x3134 + +#define EGLEW_EXT_multiview_window EGLEW_GET_VAR(__EGLEW_EXT_multiview_window) + +#endif /* EGL_EXT_multiview_window */ + +/* -------------------------- EGL_EXT_output_base -------------------------- */ + +#ifndef EGL_EXT_output_base +#define EGL_EXT_output_base 1 + +#define EGL_BAD_OUTPUT_LAYER_EXT 0x322D +#define EGL_BAD_OUTPUT_PORT_EXT 0x322E +#define EGL_SWAP_INTERVAL_EXT 0x322F + +typedef EGLBoolean ( * PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib * attrib_list, EGLOutputLayerEXT * layers, EGLint max_layers, EGLint * num_layers); +typedef EGLBoolean ( * PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib * attrib_list, EGLOutputPortEXT * ports, EGLint max_ports, EGLint * num_ports); +typedef EGLBoolean ( * PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); +typedef EGLBoolean ( * PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); +typedef EGLBoolean ( * PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib * value); +typedef const char * ( * PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); +typedef EGLBoolean ( * PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib * value); +typedef const char * ( * PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); + +#define eglGetOutputLayersEXT EGLEW_GET_FUN(__eglewGetOutputLayersEXT) +#define eglGetOutputPortsEXT EGLEW_GET_FUN(__eglewGetOutputPortsEXT) +#define eglOutputLayerAttribEXT EGLEW_GET_FUN(__eglewOutputLayerAttribEXT) +#define eglOutputPortAttribEXT EGLEW_GET_FUN(__eglewOutputPortAttribEXT) +#define eglQueryOutputLayerAttribEXT EGLEW_GET_FUN(__eglewQueryOutputLayerAttribEXT) +#define eglQueryOutputLayerStringEXT EGLEW_GET_FUN(__eglewQueryOutputLayerStringEXT) +#define eglQueryOutputPortAttribEXT EGLEW_GET_FUN(__eglewQueryOutputPortAttribEXT) +#define eglQueryOutputPortStringEXT EGLEW_GET_FUN(__eglewQueryOutputPortStringEXT) + +#define EGLEW_EXT_output_base EGLEW_GET_VAR(__EGLEW_EXT_output_base) + +#endif /* EGL_EXT_output_base */ + +/* --------------------------- EGL_EXT_output_drm -------------------------- */ + +#ifndef EGL_EXT_output_drm +#define EGL_EXT_output_drm 1 + +#define EGL_DRM_CRTC_EXT 0x3234 +#define EGL_DRM_PLANE_EXT 0x3235 +#define EGL_DRM_CONNECTOR_EXT 0x3236 + +#define EGLEW_EXT_output_drm EGLEW_GET_VAR(__EGLEW_EXT_output_drm) + +#endif /* EGL_EXT_output_drm */ + +/* ------------------------- EGL_EXT_output_openwf ------------------------- */ + +#ifndef EGL_EXT_output_openwf +#define EGL_EXT_output_openwf 1 + +#define EGL_OPENWF_PIPELINE_ID_EXT 0x3238 +#define EGL_OPENWF_PORT_ID_EXT 0x3239 + +#define EGLEW_EXT_output_openwf EGLEW_GET_VAR(__EGLEW_EXT_output_openwf) + +#endif /* EGL_EXT_output_openwf */ + +/* ----------------------- EGL_EXT_pixel_format_float ---------------------- */ + +#ifndef EGL_EXT_pixel_format_float +#define EGL_EXT_pixel_format_float 1 + +#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339 +#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A +#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B + +#define EGLEW_EXT_pixel_format_float EGLEW_GET_VAR(__EGLEW_EXT_pixel_format_float) + +#endif /* EGL_EXT_pixel_format_float */ + +/* ------------------------- EGL_EXT_platform_base ------------------------- */ + +#ifndef EGL_EXT_platform_base +#define EGL_EXT_platform_base 1 + +typedef EGLSurface ( * PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLint * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void * native_window, const EGLint * attrib_list); +typedef EGLDisplay ( * PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void * native_display, const EGLint * attrib_list); + +#define eglCreatePlatformPixmapSurfaceEXT EGLEW_GET_FUN(__eglewCreatePlatformPixmapSurfaceEXT) +#define eglCreatePlatformWindowSurfaceEXT EGLEW_GET_FUN(__eglewCreatePlatformWindowSurfaceEXT) +#define eglGetPlatformDisplayEXT EGLEW_GET_FUN(__eglewGetPlatformDisplayEXT) + +#define EGLEW_EXT_platform_base EGLEW_GET_VAR(__EGLEW_EXT_platform_base) + +#endif /* EGL_EXT_platform_base */ + +/* ------------------------ EGL_EXT_platform_device ------------------------ */ + +#ifndef EGL_EXT_platform_device +#define EGL_EXT_platform_device 1 + +#define EGL_PLATFORM_DEVICE_EXT 0x313F + +#define EGLEW_EXT_platform_device EGLEW_GET_VAR(__EGLEW_EXT_platform_device) + +#endif /* EGL_EXT_platform_device */ + +/* ------------------------ EGL_EXT_platform_wayland ----------------------- */ + +#ifndef EGL_EXT_platform_wayland +#define EGL_EXT_platform_wayland 1 + +#define EGL_PLATFORM_WAYLAND_EXT 0x31D8 + +#define EGLEW_EXT_platform_wayland EGLEW_GET_VAR(__EGLEW_EXT_platform_wayland) + +#endif /* EGL_EXT_platform_wayland */ + +/* -------------------------- EGL_EXT_platform_x11 ------------------------- */ + +#ifndef EGL_EXT_platform_x11 +#define EGL_EXT_platform_x11 1 + +#define EGL_PLATFORM_X11_EXT 0x31D5 +#define EGL_PLATFORM_X11_SCREEN_EXT 0x31D6 + +#define EGLEW_EXT_platform_x11 EGLEW_GET_VAR(__EGLEW_EXT_platform_x11) + +#endif /* EGL_EXT_platform_x11 */ + +/* ----------------------- EGL_EXT_protected_content ----------------------- */ + +#ifndef EGL_EXT_protected_content +#define EGL_EXT_protected_content 1 + +#define EGL_PROTECTED_CONTENT_EXT 0x32C0 + +#define EGLEW_EXT_protected_content EGLEW_GET_VAR(__EGLEW_EXT_protected_content) + +#endif /* EGL_EXT_protected_content */ + +/* ----------------------- EGL_EXT_protected_surface ----------------------- */ + +#ifndef EGL_EXT_protected_surface +#define EGL_EXT_protected_surface 1 + +#define EGL_PROTECTED_CONTENT_EXT 0x32C0 + +#define EGLEW_EXT_protected_surface EGLEW_GET_VAR(__EGLEW_EXT_protected_surface) + +#endif /* EGL_EXT_protected_surface */ + +/* ------------------- EGL_EXT_stream_consumer_egloutput ------------------- */ + +#ifndef EGL_EXT_stream_consumer_egloutput +#define EGL_EXT_stream_consumer_egloutput 1 + +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); + +#define eglStreamConsumerOutputEXT EGLEW_GET_FUN(__eglewStreamConsumerOutputEXT) + +#define EGLEW_EXT_stream_consumer_egloutput EGLEW_GET_VAR(__EGLEW_EXT_stream_consumer_egloutput) + +#endif /* EGL_EXT_stream_consumer_egloutput */ + +/* ------------------- EGL_EXT_surface_SMPTE2086_metadata ------------------ */ + +#ifndef EGL_EXT_surface_SMPTE2086_metadata +#define EGL_EXT_surface_SMPTE2086_metadata 1 + +#define EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT 0x3341 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT 0x3342 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT 0x3343 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT 0x3344 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT 0x3345 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT 0x3346 +#define EGL_SMPTE2086_WHITE_POINT_X_EXT 0x3347 +#define EGL_SMPTE2086_WHITE_POINT_Y_EXT 0x3348 +#define EGL_SMPTE2086_MAX_LUMINANCE_EXT 0x3349 +#define EGL_SMPTE2086_MIN_LUMINANCE_EXT 0x334A + +#define EGLEW_EXT_surface_SMPTE2086_metadata EGLEW_GET_VAR(__EGLEW_EXT_surface_SMPTE2086_metadata) + +#endif /* EGL_EXT_surface_SMPTE2086_metadata */ + +/* -------------------- EGL_EXT_swap_buffers_with_damage ------------------- */ + +#ifndef EGL_EXT_swap_buffers_with_damage +#define EGL_EXT_swap_buffers_with_damage 1 + +typedef EGLBoolean ( * PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint * rects, EGLint n_rects); + +#define eglSwapBuffersWithDamageEXT EGLEW_GET_FUN(__eglewSwapBuffersWithDamageEXT) + +#define EGLEW_EXT_swap_buffers_with_damage EGLEW_GET_VAR(__EGLEW_EXT_swap_buffers_with_damage) + +#endif /* EGL_EXT_swap_buffers_with_damage */ + +/* -------------------------- EGL_EXT_yuv_surface -------------------------- */ + +#ifndef EGL_EXT_yuv_surface +#define EGL_EXT_yuv_surface 1 + +#define EGL_YUV_BUFFER_EXT 0x3300 +#define EGL_YUV_ORDER_EXT 0x3301 +#define EGL_YUV_ORDER_YUV_EXT 0x3302 +#define EGL_YUV_ORDER_YVU_EXT 0x3303 +#define EGL_YUV_ORDER_YUYV_EXT 0x3304 +#define EGL_YUV_ORDER_UYVY_EXT 0x3305 +#define EGL_YUV_ORDER_YVYU_EXT 0x3306 +#define EGL_YUV_ORDER_VYUY_EXT 0x3307 +#define EGL_YUV_ORDER_AYUV_EXT 0x3308 +#define EGL_YUV_CSC_STANDARD_EXT 0x330A +#define EGL_YUV_CSC_STANDARD_601_EXT 0x330B +#define EGL_YUV_CSC_STANDARD_709_EXT 0x330C +#define EGL_YUV_CSC_STANDARD_2020_EXT 0x330D +#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 +#define EGL_YUV_SUBSAMPLE_EXT 0x3312 +#define EGL_YUV_SUBSAMPLE_4_2_0_EXT 0x3313 +#define EGL_YUV_SUBSAMPLE_4_2_2_EXT 0x3314 +#define EGL_YUV_SUBSAMPLE_4_4_4_EXT 0x3315 +#define EGL_YUV_DEPTH_RANGE_EXT 0x3317 +#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT 0x3318 +#define EGL_YUV_DEPTH_RANGE_FULL_EXT 0x3319 +#define EGL_YUV_PLANE_BPP_EXT 0x331A +#define EGL_YUV_PLANE_BPP_0_EXT 0x331B +#define EGL_YUV_PLANE_BPP_8_EXT 0x331C +#define EGL_YUV_PLANE_BPP_10_EXT 0x331D + +#define EGLEW_EXT_yuv_surface EGLEW_GET_VAR(__EGLEW_EXT_yuv_surface) + +#endif /* EGL_EXT_yuv_surface */ + +/* -------------------------- EGL_HI_clientpixmap -------------------------- */ + +#ifndef EGL_HI_clientpixmap +#define EGL_HI_clientpixmap 1 + +#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74 + +typedef EGLSurface ( * PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI * pixmap); + +#define eglCreatePixmapSurfaceHI EGLEW_GET_FUN(__eglewCreatePixmapSurfaceHI) + +#define EGLEW_HI_clientpixmap EGLEW_GET_VAR(__EGLEW_HI_clientpixmap) + +#endif /* EGL_HI_clientpixmap */ + +/* -------------------------- EGL_HI_colorformats -------------------------- */ + +#ifndef EGL_HI_colorformats +#define EGL_HI_colorformats 1 + +#define EGL_COLOR_FORMAT_HI 0x8F70 +#define EGL_COLOR_RGB_HI 0x8F71 +#define EGL_COLOR_RGBA_HI 0x8F72 +#define EGL_COLOR_ARGB_HI 0x8F73 + +#define EGLEW_HI_colorformats EGLEW_GET_VAR(__EGLEW_HI_colorformats) + +#endif /* EGL_HI_colorformats */ + +/* ------------------------ EGL_IMG_context_priority ----------------------- */ + +#ifndef EGL_IMG_context_priority +#define EGL_IMG_context_priority 1 + +#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 +#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 +#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 +#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 + +#define EGLEW_IMG_context_priority EGLEW_GET_VAR(__EGLEW_IMG_context_priority) + +#endif /* EGL_IMG_context_priority */ + +/* ---------------------- EGL_IMG_image_plane_attribs ---------------------- */ + +#ifndef EGL_IMG_image_plane_attribs +#define EGL_IMG_image_plane_attribs 1 + +#define EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG 0x3105 +#define EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG 0x3106 + +#define EGLEW_IMG_image_plane_attribs EGLEW_GET_VAR(__EGLEW_IMG_image_plane_attribs) + +#endif /* EGL_IMG_image_plane_attribs */ + +/* ---------------------------- EGL_KHR_cl_event --------------------------- */ + +#ifndef EGL_KHR_cl_event +#define EGL_KHR_cl_event 1 + +#define EGL_CL_EVENT_HANDLE_KHR 0x309C +#define EGL_SYNC_CL_EVENT_KHR 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF + +#define EGLEW_KHR_cl_event EGLEW_GET_VAR(__EGLEW_KHR_cl_event) + +#endif /* EGL_KHR_cl_event */ + +/* --------------------------- EGL_KHR_cl_event2 --------------------------- */ + +#ifndef EGL_KHR_cl_event2 +#define EGL_KHR_cl_event2 1 + +#define EGL_CL_EVENT_HANDLE_KHR 0x309C +#define EGL_SYNC_CL_EVENT_KHR 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF + +typedef EGLSyncKHR ( * PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const EGLAttribKHR * attrib_list); + +#define eglCreateSync64KHR EGLEW_GET_FUN(__eglewCreateSync64KHR) + +#define EGLEW_KHR_cl_event2 EGLEW_GET_VAR(__EGLEW_KHR_cl_event2) + +#endif /* EGL_KHR_cl_event2 */ + +/* ----------------- EGL_KHR_client_get_all_proc_addresses ----------------- */ + +#ifndef EGL_KHR_client_get_all_proc_addresses +#define EGL_KHR_client_get_all_proc_addresses 1 + +#define EGLEW_KHR_client_get_all_proc_addresses EGLEW_GET_VAR(__EGLEW_KHR_client_get_all_proc_addresses) + +#endif /* EGL_KHR_client_get_all_proc_addresses */ + +/* ------------------------- EGL_KHR_config_attribs ------------------------ */ + +#ifndef EGL_KHR_config_attribs +#define EGL_KHR_config_attribs 1 + +#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 +#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 +#define EGL_CONFORMANT_KHR 0x3042 + +#define EGLEW_KHR_config_attribs EGLEW_GET_VAR(__EGLEW_KHR_config_attribs) + +#endif /* EGL_KHR_config_attribs */ + +/* --------------------- EGL_KHR_context_flush_control --------------------- */ + +#ifndef EGL_KHR_context_flush_control +#define EGL_KHR_context_flush_control 1 + +#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098 + +#define EGLEW_KHR_context_flush_control EGLEW_GET_VAR(__EGLEW_KHR_context_flush_control) + +#endif /* EGL_KHR_context_flush_control */ + +/* ------------------------- EGL_KHR_create_context ------------------------ */ + +#ifndef EGL_KHR_create_context +#define EGL_KHR_create_context 1 + +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 +#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 +#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB +#define EGL_CONTEXT_FLAGS_KHR 0x30FC +#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD +#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF + +#define EGLEW_KHR_create_context EGLEW_GET_VAR(__EGLEW_KHR_create_context) + +#endif /* EGL_KHR_create_context */ + +/* -------------------- EGL_KHR_create_context_no_error -------------------- */ + +#ifndef EGL_KHR_create_context_no_error +#define EGL_KHR_create_context_no_error 1 + +#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 + +#define EGLEW_KHR_create_context_no_error EGLEW_GET_VAR(__EGLEW_KHR_create_context_no_error) + +#endif /* EGL_KHR_create_context_no_error */ + +/* ----------------------------- EGL_KHR_debug ----------------------------- */ + +#ifndef EGL_KHR_debug +#define EGL_KHR_debug 1 + +#define EGL_OBJECT_THREAD_KHR 0x33B0 +#define EGL_OBJECT_DISPLAY_KHR 0x33B1 +#define EGL_OBJECT_CONTEXT_KHR 0x33B2 +#define EGL_OBJECT_SURFACE_KHR 0x33B3 +#define EGL_OBJECT_IMAGE_KHR 0x33B4 +#define EGL_OBJECT_SYNC_KHR 0x33B5 +#define EGL_OBJECT_STREAM_KHR 0x33B6 +#define EGL_DEBUG_CALLBACK_KHR 0x33B8 +#define EGL_DEBUG_MSG_CRITICAL_KHR 0x33B9 +#define EGL_DEBUG_MSG_ERROR_KHR 0x33BA +#define EGL_DEBUG_MSG_WARN_KHR 0x33BB +#define EGL_DEBUG_MSG_INFO_KHR 0x33BC + +typedef EGLint ( * PFNEGLDEBUGMESSAGECONTROLKHRPROC) (EGLDEBUGPROCKHR callback, const EGLAttrib * attrib_list); +typedef EGLint ( * PFNEGLLABELOBJECTKHRPROC) (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label); +typedef EGLBoolean ( * PFNEGLQUERYDEBUGKHRPROC) (EGLint attribute, EGLAttrib * value); + +#define eglDebugMessageControlKHR EGLEW_GET_FUN(__eglewDebugMessageControlKHR) +#define eglLabelObjectKHR EGLEW_GET_FUN(__eglewLabelObjectKHR) +#define eglQueryDebugKHR EGLEW_GET_FUN(__eglewQueryDebugKHR) + +#define EGLEW_KHR_debug EGLEW_GET_VAR(__EGLEW_KHR_debug) + +#endif /* EGL_KHR_debug */ + +/* --------------------------- EGL_KHR_fence_sync -------------------------- */ + +#ifndef EGL_KHR_fence_sync +#define EGL_KHR_fence_sync 1 + +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 +#define EGL_SYNC_CONDITION_KHR 0x30F8 +#define EGL_SYNC_FENCE_KHR 0x30F9 + +#define EGLEW_KHR_fence_sync EGLEW_GET_VAR(__EGLEW_KHR_fence_sync) + +#endif /* EGL_KHR_fence_sync */ + +/* --------------------- EGL_KHR_get_all_proc_addresses -------------------- */ + +#ifndef EGL_KHR_get_all_proc_addresses +#define EGL_KHR_get_all_proc_addresses 1 + +#define EGLEW_KHR_get_all_proc_addresses EGLEW_GET_VAR(__EGLEW_KHR_get_all_proc_addresses) + +#endif /* EGL_KHR_get_all_proc_addresses */ + +/* ------------------------- EGL_KHR_gl_colorspace ------------------------- */ + +#ifndef EGL_KHR_gl_colorspace +#define EGL_KHR_gl_colorspace 1 + +#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 +#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A +#define EGL_GL_COLORSPACE_KHR 0x309D + +#define EGLEW_KHR_gl_colorspace EGLEW_GET_VAR(__EGLEW_KHR_gl_colorspace) + +#endif /* EGL_KHR_gl_colorspace */ + +/* --------------------- EGL_KHR_gl_renderbuffer_image --------------------- */ + +#ifndef EGL_KHR_gl_renderbuffer_image +#define EGL_KHR_gl_renderbuffer_image 1 + +#define EGL_GL_RENDERBUFFER_KHR 0x30B9 + +#define EGLEW_KHR_gl_renderbuffer_image EGLEW_GET_VAR(__EGLEW_KHR_gl_renderbuffer_image) + +#endif /* EGL_KHR_gl_renderbuffer_image */ + +/* ---------------------- EGL_KHR_gl_texture_2D_image ---------------------- */ + +#ifndef EGL_KHR_gl_texture_2D_image +#define EGL_KHR_gl_texture_2D_image 1 + +#define EGL_GL_TEXTURE_2D_KHR 0x30B1 +#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC + +#define EGLEW_KHR_gl_texture_2D_image EGLEW_GET_VAR(__EGLEW_KHR_gl_texture_2D_image) + +#endif /* EGL_KHR_gl_texture_2D_image */ + +/* ---------------------- EGL_KHR_gl_texture_3D_image ---------------------- */ + +#ifndef EGL_KHR_gl_texture_3D_image +#define EGL_KHR_gl_texture_3D_image 1 + +#define EGL_GL_TEXTURE_3D_KHR 0x30B2 +#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD + +#define EGLEW_KHR_gl_texture_3D_image EGLEW_GET_VAR(__EGLEW_KHR_gl_texture_3D_image) + +#endif /* EGL_KHR_gl_texture_3D_image */ + +/* -------------------- EGL_KHR_gl_texture_cubemap_image ------------------- */ + +#ifndef EGL_KHR_gl_texture_cubemap_image +#define EGL_KHR_gl_texture_cubemap_image 1 + +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 + +#define EGLEW_KHR_gl_texture_cubemap_image EGLEW_GET_VAR(__EGLEW_KHR_gl_texture_cubemap_image) + +#endif /* EGL_KHR_gl_texture_cubemap_image */ + +/* ----------------------------- EGL_KHR_image ----------------------------- */ + +#ifndef EGL_KHR_image +#define EGL_KHR_image 1 + +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 + +typedef EGLImageKHR ( * PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); + +#define eglCreateImageKHR EGLEW_GET_FUN(__eglewCreateImageKHR) +#define eglDestroyImageKHR EGLEW_GET_FUN(__eglewDestroyImageKHR) + +#define EGLEW_KHR_image EGLEW_GET_VAR(__EGLEW_KHR_image) + +#endif /* EGL_KHR_image */ + +/* --------------------------- EGL_KHR_image_base -------------------------- */ + +#ifndef EGL_KHR_image_base +#define EGL_KHR_image_base 1 + +#define EGL_IMAGE_PRESERVED_KHR 0x30D2 + +#define EGLEW_KHR_image_base EGLEW_GET_VAR(__EGLEW_KHR_image_base) + +#endif /* EGL_KHR_image_base */ + +/* -------------------------- EGL_KHR_image_pixmap ------------------------- */ + +#ifndef EGL_KHR_image_pixmap +#define EGL_KHR_image_pixmap 1 + +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 + +#define EGLEW_KHR_image_pixmap EGLEW_GET_VAR(__EGLEW_KHR_image_pixmap) + +#endif /* EGL_KHR_image_pixmap */ + +/* -------------------------- EGL_KHR_lock_surface ------------------------- */ + +#ifndef EGL_KHR_lock_surface +#define EGL_KHR_lock_surface 1 + +#define EGL_READ_SURFACE_BIT_KHR 0x0001 +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 +#define EGL_MATCH_FORMAT_KHR 0x3043 +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 +#define EGL_FORMAT_RGB_565_KHR 0x30C1 +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 +#define EGL_BITMAP_POINTER_KHR 0x30C6 +#define EGL_BITMAP_PITCH_KHR 0x30C7 +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD +#define EGL_LOWER_LEFT_KHR 0x30CE +#define EGL_UPPER_LEFT_KHR 0x30CF + +typedef EGLBoolean ( * PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface); + +#define eglLockSurfaceKHR EGLEW_GET_FUN(__eglewLockSurfaceKHR) +#define eglUnlockSurfaceKHR EGLEW_GET_FUN(__eglewUnlockSurfaceKHR) + +#define EGLEW_KHR_lock_surface EGLEW_GET_VAR(__EGLEW_KHR_lock_surface) + +#endif /* EGL_KHR_lock_surface */ + +/* ------------------------- EGL_KHR_lock_surface2 ------------------------- */ + +#ifndef EGL_KHR_lock_surface2 +#define EGL_KHR_lock_surface2 1 + +#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 + +#define EGLEW_KHR_lock_surface2 EGLEW_GET_VAR(__EGLEW_KHR_lock_surface2) + +#endif /* EGL_KHR_lock_surface2 */ + +/* ------------------------- EGL_KHR_lock_surface3 ------------------------- */ + +#ifndef EGL_KHR_lock_surface3 +#define EGL_KHR_lock_surface3 1 + +#define EGL_READ_SURFACE_BIT_KHR 0x0001 +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 +#define EGL_MATCH_FORMAT_KHR 0x3043 +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 +#define EGL_FORMAT_RGB_565_KHR 0x30C1 +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 +#define EGL_BITMAP_POINTER_KHR 0x30C6 +#define EGL_BITMAP_PITCH_KHR 0x30C7 +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD +#define EGL_LOWER_LEFT_KHR 0x30CE +#define EGL_UPPER_LEFT_KHR 0x30CF +#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 + +typedef EGLBoolean ( * PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR * value); + +#define eglQuerySurface64KHR EGLEW_GET_FUN(__eglewQuerySurface64KHR) + +#define EGLEW_KHR_lock_surface3 EGLEW_GET_VAR(__EGLEW_KHR_lock_surface3) + +#endif /* EGL_KHR_lock_surface3 */ + +/* --------------------- EGL_KHR_mutable_render_buffer --------------------- */ + +#ifndef EGL_KHR_mutable_render_buffer +#define EGL_KHR_mutable_render_buffer 1 + +#define EGL_MUTABLE_RENDER_BUFFER_BIT_KHR 0x1000 + +#define EGLEW_KHR_mutable_render_buffer EGLEW_GET_VAR(__EGLEW_KHR_mutable_render_buffer) + +#endif /* EGL_KHR_mutable_render_buffer */ + +/* ----------------------- EGL_KHR_no_config_context ----------------------- */ + +#ifndef EGL_KHR_no_config_context +#define EGL_KHR_no_config_context 1 + +#define EGLEW_KHR_no_config_context EGLEW_GET_VAR(__EGLEW_KHR_no_config_context) + +#endif /* EGL_KHR_no_config_context */ + +/* ------------------------- EGL_KHR_partial_update ------------------------ */ + +#ifndef EGL_KHR_partial_update +#define EGL_KHR_partial_update 1 + +#define EGL_BUFFER_AGE_KHR 0x313D + +typedef EGLBoolean ( * PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint * rects, EGLint n_rects); + +#define eglSetDamageRegionKHR EGLEW_GET_FUN(__eglewSetDamageRegionKHR) + +#define EGLEW_KHR_partial_update EGLEW_GET_VAR(__EGLEW_KHR_partial_update) + +#endif /* EGL_KHR_partial_update */ + +/* ------------------------ EGL_KHR_platform_android ----------------------- */ + +#ifndef EGL_KHR_platform_android +#define EGL_KHR_platform_android 1 + +#define EGL_PLATFORM_ANDROID_KHR 0x3141 + +#define EGLEW_KHR_platform_android EGLEW_GET_VAR(__EGLEW_KHR_platform_android) + +#endif /* EGL_KHR_platform_android */ + +/* -------------------------- EGL_KHR_platform_gbm ------------------------- */ + +#ifndef EGL_KHR_platform_gbm +#define EGL_KHR_platform_gbm 1 + +#define EGL_PLATFORM_GBM_KHR 0x31D7 + +#define EGLEW_KHR_platform_gbm EGLEW_GET_VAR(__EGLEW_KHR_platform_gbm) + +#endif /* EGL_KHR_platform_gbm */ + +/* ------------------------ EGL_KHR_platform_wayland ----------------------- */ + +#ifndef EGL_KHR_platform_wayland +#define EGL_KHR_platform_wayland 1 + +#define EGL_PLATFORM_WAYLAND_KHR 0x31D8 + +#define EGLEW_KHR_platform_wayland EGLEW_GET_VAR(__EGLEW_KHR_platform_wayland) + +#endif /* EGL_KHR_platform_wayland */ + +/* -------------------------- EGL_KHR_platform_x11 ------------------------- */ + +#ifndef EGL_KHR_platform_x11 +#define EGL_KHR_platform_x11 1 + +#define EGL_PLATFORM_X11_KHR 0x31D5 +#define EGL_PLATFORM_X11_SCREEN_KHR 0x31D6 + +#define EGLEW_KHR_platform_x11 EGLEW_GET_VAR(__EGLEW_KHR_platform_x11) + +#endif /* EGL_KHR_platform_x11 */ + +/* ------------------------- EGL_KHR_reusable_sync ------------------------- */ + +#ifndef EGL_KHR_reusable_sync +#define EGL_KHR_reusable_sync 1 + +#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 +#define EGL_SYNC_STATUS_KHR 0x30F1 +#define EGL_SIGNALED_KHR 0x30F2 +#define EGL_UNSIGNALED_KHR 0x30F3 +#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 +#define EGL_CONDITION_SATISFIED_KHR 0x30F6 +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_SYNC_REUSABLE_KHR 0x30FA +#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFF + +typedef EGLint ( * PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLSyncKHR ( * PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLBoolean ( * PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint * value); +typedef EGLBoolean ( * PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); + +#define eglClientWaitSyncKHR EGLEW_GET_FUN(__eglewClientWaitSyncKHR) +#define eglCreateSyncKHR EGLEW_GET_FUN(__eglewCreateSyncKHR) +#define eglDestroySyncKHR EGLEW_GET_FUN(__eglewDestroySyncKHR) +#define eglGetSyncAttribKHR EGLEW_GET_FUN(__eglewGetSyncAttribKHR) +#define eglSignalSyncKHR EGLEW_GET_FUN(__eglewSignalSyncKHR) + +#define EGLEW_KHR_reusable_sync EGLEW_GET_VAR(__EGLEW_KHR_reusable_sync) + +#endif /* EGL_KHR_reusable_sync */ + +/* ----------------------------- EGL_KHR_stream ---------------------------- */ + +#ifndef EGL_KHR_stream +#define EGL_KHR_stream 1 + +#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 +#define EGL_PRODUCER_FRAME_KHR 0x3212 +#define EGL_CONSUMER_FRAME_KHR 0x3213 +#define EGL_STREAM_STATE_KHR 0x3214 +#define EGL_STREAM_STATE_CREATED_KHR 0x3215 +#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 +#define EGL_STREAM_STATE_EMPTY_KHR 0x3217 +#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218 +#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219 +#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A +#define EGL_BAD_STREAM_KHR 0x321B +#define EGL_BAD_STATE_KHR 0x321C + +typedef EGLStreamKHR ( * PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean ( * PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint * value); +typedef EGLBoolean ( * PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR * value); +typedef EGLBoolean ( * PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); + +#define eglCreateStreamKHR EGLEW_GET_FUN(__eglewCreateStreamKHR) +#define eglDestroyStreamKHR EGLEW_GET_FUN(__eglewDestroyStreamKHR) +#define eglQueryStreamKHR EGLEW_GET_FUN(__eglewQueryStreamKHR) +#define eglQueryStreamu64KHR EGLEW_GET_FUN(__eglewQueryStreamu64KHR) +#define eglStreamAttribKHR EGLEW_GET_FUN(__eglewStreamAttribKHR) + +#define EGLEW_KHR_stream EGLEW_GET_VAR(__EGLEW_KHR_stream) + +#endif /* EGL_KHR_stream */ + +/* ------------------------- EGL_KHR_stream_attrib ------------------------- */ + +#ifndef EGL_KHR_stream_attrib +#define EGL_KHR_stream_attrib 1 + +#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 +#define EGL_STREAM_STATE_KHR 0x3214 +#define EGL_STREAM_STATE_CREATED_KHR 0x3215 +#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 + +typedef EGLStreamKHR ( * PFNEGLCREATESTREAMATTRIBKHRPROC) (EGLDisplay dpy, const EGLAttrib * attrib_list); +typedef EGLBoolean ( * PFNEGLQUERYSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib * value); +typedef EGLBoolean ( * PFNEGLSETSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value); +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib * attrib_list); +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib * attrib_list); + +#define eglCreateStreamAttribKHR EGLEW_GET_FUN(__eglewCreateStreamAttribKHR) +#define eglQueryStreamAttribKHR EGLEW_GET_FUN(__eglewQueryStreamAttribKHR) +#define eglSetStreamAttribKHR EGLEW_GET_FUN(__eglewSetStreamAttribKHR) +#define eglStreamConsumerAcquireAttribKHR EGLEW_GET_FUN(__eglewStreamConsumerAcquireAttribKHR) +#define eglStreamConsumerReleaseAttribKHR EGLEW_GET_FUN(__eglewStreamConsumerReleaseAttribKHR) + +#define EGLEW_KHR_stream_attrib EGLEW_GET_VAR(__EGLEW_KHR_stream_attrib) + +#endif /* EGL_KHR_stream_attrib */ + +/* ------------------- EGL_KHR_stream_consumer_gltexture ------------------- */ + +#ifndef EGL_KHR_stream_consumer_gltexture +#define EGL_KHR_stream_consumer_gltexture 1 + +#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E + +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); + +#define eglStreamConsumerAcquireKHR EGLEW_GET_FUN(__eglewStreamConsumerAcquireKHR) +#define eglStreamConsumerGLTextureExternalKHR EGLEW_GET_FUN(__eglewStreamConsumerGLTextureExternalKHR) +#define eglStreamConsumerReleaseKHR EGLEW_GET_FUN(__eglewStreamConsumerReleaseKHR) + +#define EGLEW_KHR_stream_consumer_gltexture EGLEW_GET_VAR(__EGLEW_KHR_stream_consumer_gltexture) + +#endif /* EGL_KHR_stream_consumer_gltexture */ + +/* -------------------- EGL_KHR_stream_cross_process_fd -------------------- */ + +#ifndef EGL_KHR_stream_cross_process_fd +#define EGL_KHR_stream_cross_process_fd 1 + +typedef EGLStreamKHR ( * PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); +typedef EGLNativeFileDescriptorKHR ( * PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); + +#define eglCreateStreamFromFileDescriptorKHR EGLEW_GET_FUN(__eglewCreateStreamFromFileDescriptorKHR) +#define eglGetStreamFileDescriptorKHR EGLEW_GET_FUN(__eglewGetStreamFileDescriptorKHR) + +#define EGLEW_KHR_stream_cross_process_fd EGLEW_GET_VAR(__EGLEW_KHR_stream_cross_process_fd) + +#endif /* EGL_KHR_stream_cross_process_fd */ + +/* -------------------------- EGL_KHR_stream_fifo -------------------------- */ + +#ifndef EGL_KHR_stream_fifo +#define EGL_KHR_stream_fifo 1 + +#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC +#define EGL_STREAM_TIME_NOW_KHR 0x31FD +#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE +#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF + +typedef EGLBoolean ( * PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR * value); + +#define eglQueryStreamTimeKHR EGLEW_GET_FUN(__eglewQueryStreamTimeKHR) + +#define EGLEW_KHR_stream_fifo EGLEW_GET_VAR(__EGLEW_KHR_stream_fifo) + +#endif /* EGL_KHR_stream_fifo */ + +/* ----------------- EGL_KHR_stream_producer_aldatalocator ----------------- */ + +#ifndef EGL_KHR_stream_producer_aldatalocator +#define EGL_KHR_stream_producer_aldatalocator 1 + +#define EGLEW_KHR_stream_producer_aldatalocator EGLEW_GET_VAR(__EGLEW_KHR_stream_producer_aldatalocator) + +#endif /* EGL_KHR_stream_producer_aldatalocator */ + +/* ------------------- EGL_KHR_stream_producer_eglsurface ------------------ */ + +#ifndef EGL_KHR_stream_producer_eglsurface +#define EGL_KHR_stream_producer_eglsurface 1 + +#define EGL_STREAM_BIT_KHR 0x0800 + +typedef EGLSurface ( * PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint * attrib_list); + +#define eglCreateStreamProducerSurfaceKHR EGLEW_GET_FUN(__eglewCreateStreamProducerSurfaceKHR) + +#define EGLEW_KHR_stream_producer_eglsurface EGLEW_GET_VAR(__EGLEW_KHR_stream_producer_eglsurface) + +#endif /* EGL_KHR_stream_producer_eglsurface */ + +/* ---------------------- EGL_KHR_surfaceless_context ---------------------- */ + +#ifndef EGL_KHR_surfaceless_context +#define EGL_KHR_surfaceless_context 1 + +#define EGLEW_KHR_surfaceless_context EGLEW_GET_VAR(__EGLEW_KHR_surfaceless_context) + +#endif /* EGL_KHR_surfaceless_context */ + +/* -------------------- EGL_KHR_swap_buffers_with_damage ------------------- */ + +#ifndef EGL_KHR_swap_buffers_with_damage +#define EGL_KHR_swap_buffers_with_damage 1 + +typedef EGLBoolean ( * PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint * rects, EGLint n_rects); + +#define eglSwapBuffersWithDamageKHR EGLEW_GET_FUN(__eglewSwapBuffersWithDamageKHR) + +#define EGLEW_KHR_swap_buffers_with_damage EGLEW_GET_VAR(__EGLEW_KHR_swap_buffers_with_damage) + +#endif /* EGL_KHR_swap_buffers_with_damage */ + +/* ------------------------ EGL_KHR_vg_parent_image ------------------------ */ + +#ifndef EGL_KHR_vg_parent_image +#define EGL_KHR_vg_parent_image 1 + +#define EGL_VG_PARENT_IMAGE_KHR 0x30BA + +#define EGLEW_KHR_vg_parent_image EGLEW_GET_VAR(__EGLEW_KHR_vg_parent_image) + +#endif /* EGL_KHR_vg_parent_image */ + +/* --------------------------- EGL_KHR_wait_sync --------------------------- */ + +#ifndef EGL_KHR_wait_sync +#define EGL_KHR_wait_sync 1 + +typedef EGLint ( * PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); + +#define eglWaitSyncKHR EGLEW_GET_FUN(__eglewWaitSyncKHR) + +#define EGLEW_KHR_wait_sync EGLEW_GET_VAR(__EGLEW_KHR_wait_sync) + +#endif /* EGL_KHR_wait_sync */ + +/* --------------------------- EGL_MESA_drm_image -------------------------- */ + +#ifndef EGL_MESA_drm_image +#define EGL_MESA_drm_image 1 + +#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 +#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 +#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 +#define EGL_DRM_BUFFER_USE_MESA 0x31D1 +#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 +#define EGL_DRM_BUFFER_MESA 0x31D3 +#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 + +typedef EGLImageKHR ( * PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint * name, EGLint * handle, EGLint * stride); + +#define eglCreateDRMImageMESA EGLEW_GET_FUN(__eglewCreateDRMImageMESA) +#define eglExportDRMImageMESA EGLEW_GET_FUN(__eglewExportDRMImageMESA) + +#define EGLEW_MESA_drm_image EGLEW_GET_VAR(__EGLEW_MESA_drm_image) + +#endif /* EGL_MESA_drm_image */ + +/* --------------------- EGL_MESA_image_dma_buf_export --------------------- */ + +#ifndef EGL_MESA_image_dma_buf_export +#define EGL_MESA_image_dma_buf_export 1 + +typedef EGLBoolean ( * PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int * fds, EGLint * strides, EGLint * offsets); +typedef EGLBoolean ( * PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int * fourcc, int * num_planes, EGLuint64KHR * modifiers); + +#define eglExportDMABUFImageMESA EGLEW_GET_FUN(__eglewExportDMABUFImageMESA) +#define eglExportDMABUFImageQueryMESA EGLEW_GET_FUN(__eglewExportDMABUFImageQueryMESA) + +#define EGLEW_MESA_image_dma_buf_export EGLEW_GET_VAR(__EGLEW_MESA_image_dma_buf_export) + +#endif /* EGL_MESA_image_dma_buf_export */ + +/* ------------------------- EGL_MESA_platform_gbm ------------------------- */ + +#ifndef EGL_MESA_platform_gbm +#define EGL_MESA_platform_gbm 1 + +#define EGL_PLATFORM_GBM_MESA 0x31D7 + +#define EGLEW_MESA_platform_gbm EGLEW_GET_VAR(__EGLEW_MESA_platform_gbm) + +#endif /* EGL_MESA_platform_gbm */ + +/* --------------------- EGL_MESA_platform_surfaceless --------------------- */ + +#ifndef EGL_MESA_platform_surfaceless +#define EGL_MESA_platform_surfaceless 1 + +#define EGL_PLATFORM_SURFACELESS_MESA 0x31DD + +#define EGLEW_MESA_platform_surfaceless EGLEW_GET_VAR(__EGLEW_MESA_platform_surfaceless) + +#endif /* EGL_MESA_platform_surfaceless */ + +/* -------------------------- EGL_NOK_swap_region -------------------------- */ + +#ifndef EGL_NOK_swap_region +#define EGL_NOK_swap_region 1 + +typedef EGLBoolean ( * PFNEGLSWAPBUFFERSREGIONNOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint * rects); + +#define eglSwapBuffersRegionNOK EGLEW_GET_FUN(__eglewSwapBuffersRegionNOK) + +#define EGLEW_NOK_swap_region EGLEW_GET_VAR(__EGLEW_NOK_swap_region) + +#endif /* EGL_NOK_swap_region */ + +/* -------------------------- EGL_NOK_swap_region2 ------------------------- */ + +#ifndef EGL_NOK_swap_region2 +#define EGL_NOK_swap_region2 1 + +typedef EGLBoolean ( * PFNEGLSWAPBUFFERSREGION2NOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint * rects); + +#define eglSwapBuffersRegion2NOK EGLEW_GET_FUN(__eglewSwapBuffersRegion2NOK) + +#define EGLEW_NOK_swap_region2 EGLEW_GET_VAR(__EGLEW_NOK_swap_region2) + +#endif /* EGL_NOK_swap_region2 */ + +/* ---------------------- EGL_NOK_texture_from_pixmap ---------------------- */ + +#ifndef EGL_NOK_texture_from_pixmap +#define EGL_NOK_texture_from_pixmap 1 + +#define EGL_Y_INVERTED_NOK 0x307F + +#define EGLEW_NOK_texture_from_pixmap EGLEW_GET_VAR(__EGLEW_NOK_texture_from_pixmap) + +#endif /* EGL_NOK_texture_from_pixmap */ + +/* ------------------------ EGL_NV_3dvision_surface ------------------------ */ + +#ifndef EGL_NV_3dvision_surface +#define EGL_NV_3dvision_surface 1 + +#define EGL_AUTO_STEREO_NV 0x3136 + +#define EGLEW_NV_3dvision_surface EGLEW_GET_VAR(__EGLEW_NV_3dvision_surface) + +#endif /* EGL_NV_3dvision_surface */ + +/* ------------------------- EGL_NV_coverage_sample ------------------------ */ + +#ifndef EGL_NV_coverage_sample +#define EGL_NV_coverage_sample 1 + +#define EGL_COVERAGE_BUFFERS_NV 0x30E0 +#define EGL_COVERAGE_SAMPLES_NV 0x30E1 + +#define EGLEW_NV_coverage_sample EGLEW_GET_VAR(__EGLEW_NV_coverage_sample) + +#endif /* EGL_NV_coverage_sample */ + +/* --------------------- EGL_NV_coverage_sample_resolve -------------------- */ + +#ifndef EGL_NV_coverage_sample_resolve +#define EGL_NV_coverage_sample_resolve 1 + +#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131 +#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133 + +#define EGLEW_NV_coverage_sample_resolve EGLEW_GET_VAR(__EGLEW_NV_coverage_sample_resolve) + +#endif /* EGL_NV_coverage_sample_resolve */ + +/* --------------------------- EGL_NV_cuda_event --------------------------- */ + +#ifndef EGL_NV_cuda_event +#define EGL_NV_cuda_event 1 + +#define EGL_CUDA_EVENT_HANDLE_NV 0x323B +#define EGL_SYNC_CUDA_EVENT_NV 0x323C +#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D + +#define EGLEW_NV_cuda_event EGLEW_GET_VAR(__EGLEW_NV_cuda_event) + +#endif /* EGL_NV_cuda_event */ + +/* ------------------------- EGL_NV_depth_nonlinear ------------------------ */ + +#ifndef EGL_NV_depth_nonlinear +#define EGL_NV_depth_nonlinear 1 + +#define EGL_DEPTH_ENCODING_NONE_NV 0 +#define EGL_DEPTH_ENCODING_NV 0x30E2 +#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3 + +#define EGLEW_NV_depth_nonlinear EGLEW_GET_VAR(__EGLEW_NV_depth_nonlinear) + +#endif /* EGL_NV_depth_nonlinear */ + +/* --------------------------- EGL_NV_device_cuda -------------------------- */ + +#ifndef EGL_NV_device_cuda +#define EGL_NV_device_cuda 1 + +#define EGL_CUDA_DEVICE_NV 0x323A + +#define EGLEW_NV_device_cuda EGLEW_GET_VAR(__EGLEW_NV_device_cuda) + +#endif /* EGL_NV_device_cuda */ + +/* -------------------------- EGL_NV_native_query -------------------------- */ + +#ifndef EGL_NV_native_query +#define EGL_NV_native_query 1 + +typedef EGLBoolean ( * PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType * display_id); +typedef EGLBoolean ( * PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType * pixmap); +typedef EGLBoolean ( * PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType * window); + +#define eglQueryNativeDisplayNV EGLEW_GET_FUN(__eglewQueryNativeDisplayNV) +#define eglQueryNativePixmapNV EGLEW_GET_FUN(__eglewQueryNativePixmapNV) +#define eglQueryNativeWindowNV EGLEW_GET_FUN(__eglewQueryNativeWindowNV) + +#define EGLEW_NV_native_query EGLEW_GET_VAR(__EGLEW_NV_native_query) + +#endif /* EGL_NV_native_query */ + +/* ---------------------- EGL_NV_post_convert_rounding --------------------- */ + +#ifndef EGL_NV_post_convert_rounding +#define EGL_NV_post_convert_rounding 1 + +#define EGLEW_NV_post_convert_rounding EGLEW_GET_VAR(__EGLEW_NV_post_convert_rounding) + +#endif /* EGL_NV_post_convert_rounding */ + +/* ------------------------- EGL_NV_post_sub_buffer ------------------------ */ + +#ifndef EGL_NV_post_sub_buffer +#define EGL_NV_post_sub_buffer 1 + +#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE + +typedef EGLBoolean ( * PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); + +#define eglPostSubBufferNV EGLEW_GET_FUN(__eglewPostSubBufferNV) + +#define EGLEW_NV_post_sub_buffer EGLEW_GET_VAR(__EGLEW_NV_post_sub_buffer) + +#endif /* EGL_NV_post_sub_buffer */ + +/* ------------------ EGL_NV_robustness_video_memory_purge ----------------- */ + +#ifndef EGL_NV_robustness_video_memory_purge +#define EGL_NV_robustness_video_memory_purge 1 + +#define EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C + +#define EGLEW_NV_robustness_video_memory_purge EGLEW_GET_VAR(__EGLEW_NV_robustness_video_memory_purge) + +#endif /* EGL_NV_robustness_video_memory_purge */ + +/* ------------------ EGL_NV_stream_consumer_gltexture_yuv ----------------- */ + +#ifndef EGL_NV_stream_consumer_gltexture_yuv +#define EGL_NV_stream_consumer_gltexture_yuv 1 + +#define EGL_YUV_BUFFER_EXT 0x3300 +#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 +#define EGL_YUV_PLANE0_TEXTURE_UNIT_NV 0x332C +#define EGL_YUV_PLANE1_TEXTURE_UNIT_NV 0x332D +#define EGL_YUV_PLANE2_TEXTURE_UNIT_NV 0x332E + +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLAttrib *attrib_list); + +#define eglStreamConsumerGLTextureExternalAttribsNV EGLEW_GET_FUN(__eglewStreamConsumerGLTextureExternalAttribsNV) + +#define EGLEW_NV_stream_consumer_gltexture_yuv EGLEW_GET_VAR(__EGLEW_NV_stream_consumer_gltexture_yuv) + +#endif /* EGL_NV_stream_consumer_gltexture_yuv */ + +/* ---------------------- EGL_NV_stream_cross_display ---------------------- */ + +#ifndef EGL_NV_stream_cross_display +#define EGL_NV_stream_cross_display 1 + +#define EGL_STREAM_CROSS_DISPLAY_NV 0x334E + +#define EGLEW_NV_stream_cross_display EGLEW_GET_VAR(__EGLEW_NV_stream_cross_display) + +#endif /* EGL_NV_stream_cross_display */ + +/* ----------------------- EGL_NV_stream_cross_object ---------------------- */ + +#ifndef EGL_NV_stream_cross_object +#define EGL_NV_stream_cross_object 1 + +#define EGL_STREAM_CROSS_OBJECT_NV 0x334D + +#define EGLEW_NV_stream_cross_object EGLEW_GET_VAR(__EGLEW_NV_stream_cross_object) + +#endif /* EGL_NV_stream_cross_object */ + +/* --------------------- EGL_NV_stream_cross_partition --------------------- */ + +#ifndef EGL_NV_stream_cross_partition +#define EGL_NV_stream_cross_partition 1 + +#define EGL_STREAM_CROSS_PARTITION_NV 0x323F + +#define EGLEW_NV_stream_cross_partition EGLEW_GET_VAR(__EGLEW_NV_stream_cross_partition) + +#endif /* EGL_NV_stream_cross_partition */ + +/* ---------------------- EGL_NV_stream_cross_process ---------------------- */ + +#ifndef EGL_NV_stream_cross_process +#define EGL_NV_stream_cross_process 1 + +#define EGL_STREAM_CROSS_PROCESS_NV 0x3245 + +#define EGLEW_NV_stream_cross_process EGLEW_GET_VAR(__EGLEW_NV_stream_cross_process) + +#endif /* EGL_NV_stream_cross_process */ + +/* ----------------------- EGL_NV_stream_cross_system ---------------------- */ + +#ifndef EGL_NV_stream_cross_system +#define EGL_NV_stream_cross_system 1 + +#define EGL_STREAM_CROSS_SYSTEM_NV 0x334F + +#define EGLEW_NV_stream_cross_system EGLEW_GET_VAR(__EGLEW_NV_stream_cross_system) + +#endif /* EGL_NV_stream_cross_system */ + +/* ------------------------ EGL_NV_stream_fifo_next ------------------------ */ + +#ifndef EGL_NV_stream_fifo_next +#define EGL_NV_stream_fifo_next 1 + +#define EGL_PENDING_FRAME_NV 0x3329 +#define EGL_STREAM_TIME_PENDING_NV 0x332A + +#define EGLEW_NV_stream_fifo_next EGLEW_GET_VAR(__EGLEW_NV_stream_fifo_next) + +#endif /* EGL_NV_stream_fifo_next */ + +/* --------------------- EGL_NV_stream_fifo_synchronous -------------------- */ + +#ifndef EGL_NV_stream_fifo_synchronous +#define EGL_NV_stream_fifo_synchronous 1 + +#define EGL_STREAM_FIFO_SYNCHRONOUS_NV 0x3336 + +#define EGLEW_NV_stream_fifo_synchronous EGLEW_GET_VAR(__EGLEW_NV_stream_fifo_synchronous) + +#endif /* EGL_NV_stream_fifo_synchronous */ + +/* ----------------------- EGL_NV_stream_frame_limits ---------------------- */ + +#ifndef EGL_NV_stream_frame_limits +#define EGL_NV_stream_frame_limits 1 + +#define EGL_PRODUCER_MAX_FRAME_HINT_NV 0x3337 +#define EGL_CONSUMER_MAX_FRAME_HINT_NV 0x3338 + +#define EGLEW_NV_stream_frame_limits EGLEW_GET_VAR(__EGLEW_NV_stream_frame_limits) + +#endif /* EGL_NV_stream_frame_limits */ + +/* ------------------------- EGL_NV_stream_metadata ------------------------ */ + +#ifndef EGL_NV_stream_metadata +#define EGL_NV_stream_metadata 1 + +#define EGL_MAX_STREAM_METADATA_BLOCKS_NV 0x3250 +#define EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV 0x3251 +#define EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV 0x3252 +#define EGL_PRODUCER_METADATA_NV 0x3253 +#define EGL_CONSUMER_METADATA_NV 0x3254 +#define EGL_METADATA0_SIZE_NV 0x3255 +#define EGL_METADATA1_SIZE_NV 0x3256 +#define EGL_METADATA2_SIZE_NV 0x3257 +#define EGL_METADATA3_SIZE_NV 0x3258 +#define EGL_METADATA0_TYPE_NV 0x3259 +#define EGL_METADATA1_TYPE_NV 0x325A +#define EGL_METADATA2_TYPE_NV 0x325B +#define EGL_METADATA3_TYPE_NV 0x325C +#define EGL_PENDING_METADATA_NV 0x3328 + +typedef EGLBoolean ( * PFNEGLQUERYDISPLAYATTRIBNVPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib * value); +typedef EGLBoolean ( * PFNEGLQUERYSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void * data); +typedef EGLBoolean ( * PFNEGLSETSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void * data); + +#define eglQueryDisplayAttribNV EGLEW_GET_FUN(__eglewQueryDisplayAttribNV) +#define eglQueryStreamMetadataNV EGLEW_GET_FUN(__eglewQueryStreamMetadataNV) +#define eglSetStreamMetadataNV EGLEW_GET_FUN(__eglewSetStreamMetadataNV) + +#define EGLEW_NV_stream_metadata EGLEW_GET_VAR(__EGLEW_NV_stream_metadata) + +#endif /* EGL_NV_stream_metadata */ + +/* -------------------------- EGL_NV_stream_remote ------------------------- */ + +#ifndef EGL_NV_stream_remote +#define EGL_NV_stream_remote 1 + +#define EGL_STREAM_STATE_INITIALIZING_NV 0x3240 +#define EGL_STREAM_TYPE_NV 0x3241 +#define EGL_STREAM_PROTOCOL_NV 0x3242 +#define EGL_STREAM_ENDPOINT_NV 0x3243 +#define EGL_STREAM_LOCAL_NV 0x3244 +#define EGL_STREAM_PROTOCOL_FD_NV 0x3246 +#define EGL_STREAM_PRODUCER_NV 0x3247 +#define EGL_STREAM_CONSUMER_NV 0x3248 + +#define EGLEW_NV_stream_remote EGLEW_GET_VAR(__EGLEW_NV_stream_remote) + +#endif /* EGL_NV_stream_remote */ + +/* -------------------------- EGL_NV_stream_reset -------------------------- */ + +#ifndef EGL_NV_stream_reset +#define EGL_NV_stream_reset 1 + +#define EGL_SUPPORT_RESET_NV 0x3334 +#define EGL_SUPPORT_REUSE_NV 0x3335 + +typedef EGLBoolean ( * PFNEGLRESETSTREAMNVPROC) (EGLDisplay dpy, EGLStreamKHR stream); + +#define eglResetStreamNV EGLEW_GET_FUN(__eglewResetStreamNV) + +#define EGLEW_NV_stream_reset EGLEW_GET_VAR(__EGLEW_NV_stream_reset) + +#endif /* EGL_NV_stream_reset */ + +/* -------------------------- EGL_NV_stream_socket ------------------------- */ + +#ifndef EGL_NV_stream_socket +#define EGL_NV_stream_socket 1 + +#define EGL_STREAM_PROTOCOL_SOCKET_NV 0x324B +#define EGL_SOCKET_HANDLE_NV 0x324C +#define EGL_SOCKET_TYPE_NV 0x324D + +#define EGLEW_NV_stream_socket EGLEW_GET_VAR(__EGLEW_NV_stream_socket) + +#endif /* EGL_NV_stream_socket */ + +/* ----------------------- EGL_NV_stream_socket_inet ----------------------- */ + +#ifndef EGL_NV_stream_socket_inet +#define EGL_NV_stream_socket_inet 1 + +#define EGL_SOCKET_TYPE_INET_NV 0x324F + +#define EGLEW_NV_stream_socket_inet EGLEW_GET_VAR(__EGLEW_NV_stream_socket_inet) + +#endif /* EGL_NV_stream_socket_inet */ + +/* ----------------------- EGL_NV_stream_socket_unix ----------------------- */ + +#ifndef EGL_NV_stream_socket_unix +#define EGL_NV_stream_socket_unix 1 + +#define EGL_SOCKET_TYPE_UNIX_NV 0x324E + +#define EGLEW_NV_stream_socket_unix EGLEW_GET_VAR(__EGLEW_NV_stream_socket_unix) + +#endif /* EGL_NV_stream_socket_unix */ + +/* --------------------------- EGL_NV_stream_sync -------------------------- */ + +#ifndef EGL_NV_stream_sync +#define EGL_NV_stream_sync 1 + +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_SYNC_NEW_FRAME_NV 0x321F + +typedef EGLSyncKHR ( * PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint * attrib_list); + +#define eglCreateStreamSyncNV EGLEW_GET_FUN(__eglewCreateStreamSyncNV) + +#define EGLEW_NV_stream_sync EGLEW_GET_VAR(__EGLEW_NV_stream_sync) + +#endif /* EGL_NV_stream_sync */ + +/* ------------------------------ EGL_NV_sync ------------------------------ */ + +#ifndef EGL_NV_sync +#define EGL_NV_sync 1 + +#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6 +#define EGL_SYNC_STATUS_NV 0x30E7 +#define EGL_SIGNALED_NV 0x30E8 +#define EGL_UNSIGNALED_NV 0x30E9 +#define EGL_ALREADY_SIGNALED_NV 0x30EA +#define EGL_TIMEOUT_EXPIRED_NV 0x30EB +#define EGL_CONDITION_SATISFIED_NV 0x30EC +#define EGL_SYNC_TYPE_NV 0x30ED +#define EGL_SYNC_CONDITION_NV 0x30EE +#define EGL_SYNC_FENCE_NV 0x30EF +#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFF + +typedef EGLint ( * PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +typedef EGLSyncNV ( * PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync); +typedef EGLBoolean ( * PFNEGLFENCENVPROC) (EGLSyncNV sync); +typedef EGLBoolean ( * PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint * value); +typedef EGLBoolean ( * PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode); + +#define eglClientWaitSyncNV EGLEW_GET_FUN(__eglewClientWaitSyncNV) +#define eglCreateFenceSyncNV EGLEW_GET_FUN(__eglewCreateFenceSyncNV) +#define eglDestroySyncNV EGLEW_GET_FUN(__eglewDestroySyncNV) +#define eglFenceNV EGLEW_GET_FUN(__eglewFenceNV) +#define eglGetSyncAttribNV EGLEW_GET_FUN(__eglewGetSyncAttribNV) +#define eglSignalSyncNV EGLEW_GET_FUN(__eglewSignalSyncNV) + +#define EGLEW_NV_sync EGLEW_GET_VAR(__EGLEW_NV_sync) + +#endif /* EGL_NV_sync */ + +/* --------------------------- EGL_NV_system_time -------------------------- */ + +#ifndef EGL_NV_system_time +#define EGL_NV_system_time 1 + +typedef EGLuint64NV ( * PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) ( void ); +typedef EGLuint64NV ( * PFNEGLGETSYSTEMTIMENVPROC) ( void ); + +#define eglGetSystemTimeFrequencyNV EGLEW_GET_FUN(__eglewGetSystemTimeFrequencyNV) +#define eglGetSystemTimeNV EGLEW_GET_FUN(__eglewGetSystemTimeNV) + +#define EGLEW_NV_system_time EGLEW_GET_VAR(__EGLEW_NV_system_time) + +#endif /* EGL_NV_system_time */ + +/* --------------------- EGL_TIZEN_image_native_buffer --------------------- */ + +#ifndef EGL_TIZEN_image_native_buffer +#define EGL_TIZEN_image_native_buffer 1 + +#define EGL_NATIVE_BUFFER_TIZEN 0x32A0 + +#define EGLEW_TIZEN_image_native_buffer EGLEW_GET_VAR(__EGLEW_TIZEN_image_native_buffer) + +#endif /* EGL_TIZEN_image_native_buffer */ + +/* --------------------- EGL_TIZEN_image_native_surface -------------------- */ + +#ifndef EGL_TIZEN_image_native_surface +#define EGL_TIZEN_image_native_surface 1 + +#define EGL_NATIVE_SURFACE_TIZEN 0x32A1 + +#define EGLEW_TIZEN_image_native_surface EGLEW_GET_VAR(__EGLEW_TIZEN_image_native_surface) + +#endif /* EGL_TIZEN_image_native_surface */ + +/* ------------------------------------------------------------------------- */ + +#define EGLEW_FUN_EXPORT GLEW_FUN_EXPORT +#define EGLEW_VAR_EXPORT GLEW_VAR_EXPORT + +EGLEW_FUN_EXPORT PFNEGLCHOOSECONFIGPROC __eglewChooseConfig; +EGLEW_FUN_EXPORT PFNEGLCOPYBUFFERSPROC __eglewCopyBuffers; +EGLEW_FUN_EXPORT PFNEGLCREATECONTEXTPROC __eglewCreateContext; +EGLEW_FUN_EXPORT PFNEGLCREATEPBUFFERSURFACEPROC __eglewCreatePbufferSurface; +EGLEW_FUN_EXPORT PFNEGLCREATEPIXMAPSURFACEPROC __eglewCreatePixmapSurface; +EGLEW_FUN_EXPORT PFNEGLCREATEWINDOWSURFACEPROC __eglewCreateWindowSurface; +EGLEW_FUN_EXPORT PFNEGLDESTROYCONTEXTPROC __eglewDestroyContext; +EGLEW_FUN_EXPORT PFNEGLDESTROYSURFACEPROC __eglewDestroySurface; +EGLEW_FUN_EXPORT PFNEGLGETCONFIGATTRIBPROC __eglewGetConfigAttrib; +EGLEW_FUN_EXPORT PFNEGLGETCONFIGSPROC __eglewGetConfigs; +EGLEW_FUN_EXPORT PFNEGLGETCURRENTDISPLAYPROC __eglewGetCurrentDisplay; +EGLEW_FUN_EXPORT PFNEGLGETCURRENTSURFACEPROC __eglewGetCurrentSurface; +EGLEW_FUN_EXPORT PFNEGLGETDISPLAYPROC __eglewGetDisplay; +EGLEW_FUN_EXPORT PFNEGLGETERRORPROC __eglewGetError; +EGLEW_FUN_EXPORT PFNEGLINITIALIZEPROC __eglewInitialize; +EGLEW_FUN_EXPORT PFNEGLMAKECURRENTPROC __eglewMakeCurrent; +EGLEW_FUN_EXPORT PFNEGLQUERYCONTEXTPROC __eglewQueryContext; +EGLEW_FUN_EXPORT PFNEGLQUERYSTRINGPROC __eglewQueryString; +EGLEW_FUN_EXPORT PFNEGLQUERYSURFACEPROC __eglewQuerySurface; +EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSPROC __eglewSwapBuffers; +EGLEW_FUN_EXPORT PFNEGLTERMINATEPROC __eglewTerminate; +EGLEW_FUN_EXPORT PFNEGLWAITGLPROC __eglewWaitGL; +EGLEW_FUN_EXPORT PFNEGLWAITNATIVEPROC __eglewWaitNative; + +EGLEW_FUN_EXPORT PFNEGLBINDTEXIMAGEPROC __eglewBindTexImage; +EGLEW_FUN_EXPORT PFNEGLRELEASETEXIMAGEPROC __eglewReleaseTexImage; +EGLEW_FUN_EXPORT PFNEGLSURFACEATTRIBPROC __eglewSurfaceAttrib; +EGLEW_FUN_EXPORT PFNEGLSWAPINTERVALPROC __eglewSwapInterval; + +EGLEW_FUN_EXPORT PFNEGLBINDAPIPROC __eglewBindAPI; +EGLEW_FUN_EXPORT PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC __eglewCreatePbufferFromClientBuffer; +EGLEW_FUN_EXPORT PFNEGLQUERYAPIPROC __eglewQueryAPI; +EGLEW_FUN_EXPORT PFNEGLRELEASETHREADPROC __eglewReleaseThread; +EGLEW_FUN_EXPORT PFNEGLWAITCLIENTPROC __eglewWaitClient; + +EGLEW_FUN_EXPORT PFNEGLGETCURRENTCONTEXTPROC __eglewGetCurrentContext; + +EGLEW_FUN_EXPORT PFNEGLCLIENTWAITSYNCPROC __eglewClientWaitSync; +EGLEW_FUN_EXPORT PFNEGLCREATEIMAGEPROC __eglewCreateImage; +EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC __eglewCreatePlatformPixmapSurface; +EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMWINDOWSURFACEPROC __eglewCreatePlatformWindowSurface; +EGLEW_FUN_EXPORT PFNEGLCREATESYNCPROC __eglewCreateSync; +EGLEW_FUN_EXPORT PFNEGLDESTROYIMAGEPROC __eglewDestroyImage; +EGLEW_FUN_EXPORT PFNEGLDESTROYSYNCPROC __eglewDestroySync; +EGLEW_FUN_EXPORT PFNEGLGETPLATFORMDISPLAYPROC __eglewGetPlatformDisplay; +EGLEW_FUN_EXPORT PFNEGLGETSYNCATTRIBPROC __eglewGetSyncAttrib; +EGLEW_FUN_EXPORT PFNEGLWAITSYNCPROC __eglewWaitSync; + +EGLEW_FUN_EXPORT PFNEGLSETBLOBCACHEFUNCSANDROIDPROC __eglewSetBlobCacheFuncsANDROID; + +EGLEW_FUN_EXPORT PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC __eglewCreateNativeClientBufferANDROID; + +EGLEW_FUN_EXPORT PFNEGLDUPNATIVEFENCEFDANDROIDPROC __eglewDupNativeFenceFDANDROID; + +EGLEW_FUN_EXPORT PFNEGLPRESENTATIONTIMEANDROIDPROC __eglewPresentationTimeANDROID; + +EGLEW_FUN_EXPORT PFNEGLQUERYSURFACEPOINTERANGLEPROC __eglewQuerySurfacePointerANGLE; + +EGLEW_FUN_EXPORT PFNEGLQUERYDEVICESEXTPROC __eglewQueryDevicesEXT; + +EGLEW_FUN_EXPORT PFNEGLQUERYDEVICEATTRIBEXTPROC __eglewQueryDeviceAttribEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYDEVICESTRINGEXTPROC __eglewQueryDeviceStringEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYDISPLAYATTRIBEXTPROC __eglewQueryDisplayAttribEXT; + +EGLEW_FUN_EXPORT PFNEGLQUERYDMABUFFORMATSEXTPROC __eglewQueryDmaBufFormatsEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYDMABUFMODIFIERSEXTPROC __eglewQueryDmaBufModifiersEXT; + +EGLEW_FUN_EXPORT PFNEGLGETOUTPUTLAYERSEXTPROC __eglewGetOutputLayersEXT; +EGLEW_FUN_EXPORT PFNEGLGETOUTPUTPORTSEXTPROC __eglewGetOutputPortsEXT; +EGLEW_FUN_EXPORT PFNEGLOUTPUTLAYERATTRIBEXTPROC __eglewOutputLayerAttribEXT; +EGLEW_FUN_EXPORT PFNEGLOUTPUTPORTATTRIBEXTPROC __eglewOutputPortAttribEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC __eglewQueryOutputLayerAttribEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC __eglewQueryOutputLayerStringEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC __eglewQueryOutputPortAttribEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC __eglewQueryOutputPortStringEXT; + +EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC __eglewCreatePlatformPixmapSurfaceEXT; +EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC __eglewCreatePlatformWindowSurfaceEXT; +EGLEW_FUN_EXPORT PFNEGLGETPLATFORMDISPLAYEXTPROC __eglewGetPlatformDisplayEXT; + +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMEROUTPUTEXTPROC __eglewStreamConsumerOutputEXT; + +EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC __eglewSwapBuffersWithDamageEXT; + +EGLEW_FUN_EXPORT PFNEGLCREATEPIXMAPSURFACEHIPROC __eglewCreatePixmapSurfaceHI; + +EGLEW_FUN_EXPORT PFNEGLCREATESYNC64KHRPROC __eglewCreateSync64KHR; + +EGLEW_FUN_EXPORT PFNEGLDEBUGMESSAGECONTROLKHRPROC __eglewDebugMessageControlKHR; +EGLEW_FUN_EXPORT PFNEGLLABELOBJECTKHRPROC __eglewLabelObjectKHR; +EGLEW_FUN_EXPORT PFNEGLQUERYDEBUGKHRPROC __eglewQueryDebugKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATEIMAGEKHRPROC __eglewCreateImageKHR; +EGLEW_FUN_EXPORT PFNEGLDESTROYIMAGEKHRPROC __eglewDestroyImageKHR; + +EGLEW_FUN_EXPORT PFNEGLLOCKSURFACEKHRPROC __eglewLockSurfaceKHR; +EGLEW_FUN_EXPORT PFNEGLUNLOCKSURFACEKHRPROC __eglewUnlockSurfaceKHR; + +EGLEW_FUN_EXPORT PFNEGLQUERYSURFACE64KHRPROC __eglewQuerySurface64KHR; + +EGLEW_FUN_EXPORT PFNEGLSETDAMAGEREGIONKHRPROC __eglewSetDamageRegionKHR; + +EGLEW_FUN_EXPORT PFNEGLCLIENTWAITSYNCKHRPROC __eglewClientWaitSyncKHR; +EGLEW_FUN_EXPORT PFNEGLCREATESYNCKHRPROC __eglewCreateSyncKHR; +EGLEW_FUN_EXPORT PFNEGLDESTROYSYNCKHRPROC __eglewDestroySyncKHR; +EGLEW_FUN_EXPORT PFNEGLGETSYNCATTRIBKHRPROC __eglewGetSyncAttribKHR; +EGLEW_FUN_EXPORT PFNEGLSIGNALSYNCKHRPROC __eglewSignalSyncKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATESTREAMKHRPROC __eglewCreateStreamKHR; +EGLEW_FUN_EXPORT PFNEGLDESTROYSTREAMKHRPROC __eglewDestroyStreamKHR; +EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMKHRPROC __eglewQueryStreamKHR; +EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMU64KHRPROC __eglewQueryStreamu64KHR; +EGLEW_FUN_EXPORT PFNEGLSTREAMATTRIBKHRPROC __eglewStreamAttribKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATESTREAMATTRIBKHRPROC __eglewCreateStreamAttribKHR; +EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMATTRIBKHRPROC __eglewQueryStreamAttribKHR; +EGLEW_FUN_EXPORT PFNEGLSETSTREAMATTRIBKHRPROC __eglewSetStreamAttribKHR; +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC __eglewStreamConsumerAcquireAttribKHR; +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC __eglewStreamConsumerReleaseAttribKHR; + +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERACQUIREKHRPROC __eglewStreamConsumerAcquireKHR; +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC __eglewStreamConsumerGLTextureExternalKHR; +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERRELEASEKHRPROC __eglewStreamConsumerReleaseKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC __eglewCreateStreamFromFileDescriptorKHR; +EGLEW_FUN_EXPORT PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC __eglewGetStreamFileDescriptorKHR; + +EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMTIMEKHRPROC __eglewQueryStreamTimeKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC __eglewCreateStreamProducerSurfaceKHR; + +EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC __eglewSwapBuffersWithDamageKHR; + +EGLEW_FUN_EXPORT PFNEGLWAITSYNCKHRPROC __eglewWaitSyncKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATEDRMIMAGEMESAPROC __eglewCreateDRMImageMESA; +EGLEW_FUN_EXPORT PFNEGLEXPORTDRMIMAGEMESAPROC __eglewExportDRMImageMESA; + +EGLEW_FUN_EXPORT PFNEGLEXPORTDMABUFIMAGEMESAPROC __eglewExportDMABUFImageMESA; +EGLEW_FUN_EXPORT PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC __eglewExportDMABUFImageQueryMESA; + +EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSREGIONNOKPROC __eglewSwapBuffersRegionNOK; + +EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSREGION2NOKPROC __eglewSwapBuffersRegion2NOK; + +EGLEW_FUN_EXPORT PFNEGLQUERYNATIVEDISPLAYNVPROC __eglewQueryNativeDisplayNV; +EGLEW_FUN_EXPORT PFNEGLQUERYNATIVEPIXMAPNVPROC __eglewQueryNativePixmapNV; +EGLEW_FUN_EXPORT PFNEGLQUERYNATIVEWINDOWNVPROC __eglewQueryNativeWindowNV; + +EGLEW_FUN_EXPORT PFNEGLPOSTSUBBUFFERNVPROC __eglewPostSubBufferNV; + +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC __eglewStreamConsumerGLTextureExternalAttribsNV; + +EGLEW_FUN_EXPORT PFNEGLQUERYDISPLAYATTRIBNVPROC __eglewQueryDisplayAttribNV; +EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMMETADATANVPROC __eglewQueryStreamMetadataNV; +EGLEW_FUN_EXPORT PFNEGLSETSTREAMMETADATANVPROC __eglewSetStreamMetadataNV; + +EGLEW_FUN_EXPORT PFNEGLRESETSTREAMNVPROC __eglewResetStreamNV; + +EGLEW_FUN_EXPORT PFNEGLCREATESTREAMSYNCNVPROC __eglewCreateStreamSyncNV; + +EGLEW_FUN_EXPORT PFNEGLCLIENTWAITSYNCNVPROC __eglewClientWaitSyncNV; +EGLEW_FUN_EXPORT PFNEGLCREATEFENCESYNCNVPROC __eglewCreateFenceSyncNV; +EGLEW_FUN_EXPORT PFNEGLDESTROYSYNCNVPROC __eglewDestroySyncNV; +EGLEW_FUN_EXPORT PFNEGLFENCENVPROC __eglewFenceNV; +EGLEW_FUN_EXPORT PFNEGLGETSYNCATTRIBNVPROC __eglewGetSyncAttribNV; +EGLEW_FUN_EXPORT PFNEGLSIGNALSYNCNVPROC __eglewSignalSyncNV; + +EGLEW_FUN_EXPORT PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC __eglewGetSystemTimeFrequencyNV; +EGLEW_FUN_EXPORT PFNEGLGETSYSTEMTIMENVPROC __eglewGetSystemTimeNV; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_0; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_1; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_2; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_3; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_4; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_5; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_blob_cache; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_create_native_client_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_framebuffer_target; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_front_buffer_auto_refresh; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_image_native_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_native_fence_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_presentation_time; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_recordable; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_d3d_share_handle_client_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_device_d3d; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_query_surface_pointer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_surface_d3d_texture_2d_share_handle; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_window_fixed_size; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ARM_implicit_external_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ARM_pixmap_multisample_discard; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_buffer_age; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_client_extensions; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_create_context_robustness; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_base; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_drm; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_enumeration; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_openwf; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_query; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_gl_colorspace_bt2020_linear; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_gl_colorspace_bt2020_pq; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_gl_colorspace_scrgb_linear; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_image_dma_buf_import; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_image_dma_buf_import_modifiers; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_multiview_window; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_output_base; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_output_drm; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_output_openwf; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_pixel_format_float; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_base; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_device; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_wayland; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_x11; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_protected_content; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_protected_surface; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_stream_consumer_egloutput; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_surface_SMPTE2086_metadata; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_swap_buffers_with_damage; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_yuv_surface; +EGLEW_VAR_EXPORT GLboolean __EGLEW_HI_clientpixmap; +EGLEW_VAR_EXPORT GLboolean __EGLEW_HI_colorformats; +EGLEW_VAR_EXPORT GLboolean __EGLEW_IMG_context_priority; +EGLEW_VAR_EXPORT GLboolean __EGLEW_IMG_image_plane_attribs; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_cl_event; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_cl_event2; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_client_get_all_proc_addresses; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_config_attribs; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_context_flush_control; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_create_context; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_create_context_no_error; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_debug; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_fence_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_get_all_proc_addresses; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_colorspace; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_renderbuffer_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_texture_2D_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_texture_3D_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_texture_cubemap_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_image_base; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_image_pixmap; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_lock_surface; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_lock_surface2; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_lock_surface3; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_mutable_render_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_no_config_context; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_partial_update; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_android; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_gbm; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_wayland; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_x11; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_reusable_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_attrib; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_consumer_gltexture; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_cross_process_fd; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_fifo; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_producer_aldatalocator; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_producer_eglsurface; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_surfaceless_context; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_swap_buffers_with_damage; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_vg_parent_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_wait_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_drm_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_image_dma_buf_export; +EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_platform_gbm; +EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_platform_surfaceless; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NOK_swap_region; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NOK_swap_region2; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NOK_texture_from_pixmap; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_3dvision_surface; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_coverage_sample; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_coverage_sample_resolve; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_cuda_event; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_depth_nonlinear; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_device_cuda; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_native_query; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_post_convert_rounding; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_post_sub_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_robustness_video_memory_purge; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_consumer_gltexture_yuv; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_display; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_object; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_partition; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_process; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_system; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_fifo_next; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_fifo_synchronous; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_frame_limits; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_metadata; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_remote; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_reset; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_socket; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_socket_inet; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_socket_unix; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_system_time; +EGLEW_VAR_EXPORT GLboolean __EGLEW_TIZEN_image_native_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_TIZEN_image_native_surface; +/* ------------------------------------------------------------------------ */ + +GLEWAPI GLenum GLEWAPIENTRY eglewInit (EGLDisplay display); +GLEWAPI GLboolean GLEWAPIENTRY eglewIsSupported (const char *name); + +#define EGLEW_GET_VAR(x) (*(const GLboolean*)&x) +#define EGLEW_GET_FUN(x) x + +GLEWAPI GLboolean GLEWAPIENTRY eglewGetExtension (const char *name); + +#ifdef __cplusplus +} +#endif + +#endif /* __eglew_h__ */ diff --git a/NothinFancy/dep/include/GL/glew.h b/NothinFancy/dep/include/GL/glew.h new file mode 100644 index 0000000..b5b6987 --- /dev/null +++ b/NothinFancy/dep/include/GL/glew.h @@ -0,0 +1,23686 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** 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(_GL_H) || defined(__X_GL_H) +#error gl.h included before glew.h +#endif +#if defined(__gl2_h_) +#error gl2.h included before glew.h +#endif +#if defined(__gltypes_h_) +#error gltypes.h included before glew.h +#endif +#if defined(__REGAL_H__) +#error Regal.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 __gl2_h_ +#define __GL_H__ +#define _GL_H +#define __gltypes_h_ +#define __REGAL_H__ +#define __X_GL_H +#define __glext_h_ +#define __GLEXT_H_ +#define __gl_ATI_h_ + +#if defined(_WIN32) + +/* + * GLEW does not include to avoid name space pollution. + * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t + * defined properly. + */ +/* and */ +#ifdef APIENTRY +# ifndef GLAPIENTRY +# define GLAPIENTRY APIENTRY +# endif +# ifndef GLEWAPIENTRY +# define GLEWAPIENTRY APIENTRY +# endif +#else +#define GLEW_APIENTRY_DEFINED +# if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) +# define APIENTRY __stdcall +# ifndef GLAPIENTRY +# define GLAPIENTRY __stdcall +# endif +# ifndef GLEWAPIENTRY +# define GLEWAPIENTRY __stdcall +# endif +# else +# define APIENTRY +# endif +#endif +#ifndef GLAPI +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define GLAPI extern +# endif +#endif +/* */ +#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 +/* and */ +#ifndef WINGDIAPI +#define GLEW_WINGDIAPI_DEFINED +#define WINGDIAPI __declspec(dllimport) +#endif +/* */ +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +#endif +/* */ +#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 + +/* + * 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 + +/* 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 +#else +#include +#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 + +/* */ +#ifndef GLAPI +#define GLAPI extern +#endif + +#endif /* _WIN32 */ + +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#ifndef GLEWAPIENTRY +#define GLEWAPIENTRY +#endif + +#define GLEW_VAR_EXPORT GLEWAPI +#define GLEW_FUN_EXPORT GLEWAPI + +#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 +# 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 void *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 void *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 void *indices); +GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); +GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *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, void* *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, void *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 void *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 void *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 void *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, void *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 void *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 void *pixels); +GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *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 void *pixels); +GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *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 void *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 +# ifdef __APPLE__ +# include +# if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +# define GLEW_NO_GLU +# endif +# endif +#endif + +#ifndef GLEW_NO_GLU +/* this is where we can safely include GLU */ +# if defined(__APPLE__) && defined(__MACH__) +# include +# else +# include +# 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_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 void *indices); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + +#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 void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *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 void *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *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 void *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 drawcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount); +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 void *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_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC1_RGB GL_SOURCE1_RGB +#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 void* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* 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, void** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* 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 void* (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 modeRGB, GLenum modeAlpha); +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 index); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +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 index, GLenum pname, void** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params); +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 *const* string, const GLint* length); +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +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 void* 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_CLIP_DISTANCE0 GL_CLIP_PLANE0 +#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 +#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 +#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 +#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 +#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 +#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB +#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES +#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_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_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 id, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name); +typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer); + +#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 mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer); + +#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 target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data); + +#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_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_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_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 GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#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_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 + +#define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2) + +#endif /* GL_VERSION_4_2 */ + +/* ----------------------------- GL_VERSION_4_3 ---------------------------- */ + +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 + +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E + +#define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3) + +#endif /* GL_VERSION_4_3 */ + +/* ----------------------------- GL_VERSION_4_4 ---------------------------- */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 + +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A + +#define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) + +#endif /* GL_VERSION_4_4 */ + +/* ----------------------------- GL_VERSION_4_5 ---------------------------- */ + +#ifndef GL_VERSION_4_5 +#define GL_VERSION_4_5 1 + +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 + +typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEPROC) (GLenum tex, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); + +#define glGetGraphicsResetStatus GLEW_GET_FUN(__glewGetGraphicsResetStatus) +#define glGetnCompressedTexImage GLEW_GET_FUN(__glewGetnCompressedTexImage) +#define glGetnTexImage GLEW_GET_FUN(__glewGetnTexImage) +#define glGetnUniformdv GLEW_GET_FUN(__glewGetnUniformdv) + +#define GLEW_VERSION_4_5 GLEW_GET_VAR(__GLEW_VERSION_4_5) + +#endif /* GL_VERSION_4_5 */ + +/* ----------------------------- GL_VERSION_4_6 ---------------------------- */ + +#ifndef GL_VERSION_4_6 +#define GL_VERSION_4_6 1 + +#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 +#define GL_PARAMETER_BUFFER 0x80EE +#define GL_PARAMETER_BUFFER_BINDING 0x80EF +#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED +#define GL_VERTICES_SUBMITTED 0x82EE +#define GL_PRIMITIVES_SUBMITTED 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B +#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 +#define GL_SPIR_V_BINARY 0x9552 +#define GL_SPIR_V_EXTENSIONS 0x9553 +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); + +#define glMultiDrawArraysIndirectCount GLEW_GET_FUN(__glewMultiDrawArraysIndirectCount) +#define glMultiDrawElementsIndirectCount GLEW_GET_FUN(__glewMultiDrawElementsIndirectCount) +#define glSpecializeShader GLEW_GET_FUN(__glewSpecializeShader) + +#define GLEW_VERSION_4_6 GLEW_GET_VAR(__GLEW_VERSION_4_6) + +#endif /* GL_VERSION_4_6 */ + +/* -------------------------- 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_compressed_3DC_texture --------------------- */ + +#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 + +#define GLEW_AMD_compressed_3DC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_3DC_texture) + +#endif /* GL_AMD_compressed_3DC_texture */ + +/* --------------------- GL_AMD_compressed_ATC_texture --------------------- */ + +#ifndef GL_AMD_compressed_ATC_texture +#define GL_AMD_compressed_ATC_texture 1 + +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 + +#define GLEW_AMD_compressed_ATC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_ATC_texture) + +#endif /* GL_AMD_compressed_ATC_texture */ + +/* ----------------------- 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 (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* 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 GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* 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_framebuffer_sample_positions ------------------ */ + +#ifndef GL_AMD_framebuffer_sample_positions +#define GL_AMD_framebuffer_sample_positions 1 + +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +#define GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD 0x91AE +#define GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD 0x91AF +#define GL_ALL_PIXELS_AMD 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat* values); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC) (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC) (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat* values); + +#define glFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewFramebufferSamplePositionsfvAMD) +#define glGetFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetFramebufferParameterfvAMD) +#define glGetNamedFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetNamedFramebufferParameterfvAMD) +#define glNamedFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewNamedFramebufferSamplePositionsfvAMD) + +#define GLEW_AMD_framebuffer_sample_positions GLEW_GET_VAR(__GLEW_AMD_framebuffer_sample_positions) + +#endif /* GL_AMD_framebuffer_sample_positions */ + +/* --------------------------- GL_AMD_gcn_shader --------------------------- */ + +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 + +#define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader) + +#endif /* GL_AMD_gcn_shader */ + +/* ---------------------- GL_AMD_gpu_shader_half_float --------------------- */ + +#ifndef GL_AMD_gpu_shader_half_float +#define GL_AMD_gpu_shader_half_float 1 + +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +#define GL_FLOAT16_MAT2_AMD 0x91C5 +#define GL_FLOAT16_MAT3_AMD 0x91C6 +#define GL_FLOAT16_MAT4_AMD 0x91C7 +#define GL_FLOAT16_MAT2x3_AMD 0x91C8 +#define GL_FLOAT16_MAT2x4_AMD 0x91C9 +#define GL_FLOAT16_MAT3x2_AMD 0x91CA +#define GL_FLOAT16_MAT3x4_AMD 0x91CB +#define GL_FLOAT16_MAT4x2_AMD 0x91CC +#define GL_FLOAT16_MAT4x3_AMD 0x91CD + +#define GLEW_AMD_gpu_shader_half_float GLEW_GET_VAR(__GLEW_AMD_gpu_shader_half_float) + +#endif /* GL_AMD_gpu_shader_half_float */ + +/* ------------------------ GL_AMD_gpu_shader_int16 ------------------------ */ + +#ifndef GL_AMD_gpu_shader_int16 +#define GL_AMD_gpu_shader_int16 1 + +#define GLEW_AMD_gpu_shader_int16 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int16) + +#endif /* GL_AMD_gpu_shader_int16 */ + +/* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */ + +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 + +#define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64) + +#endif /* GL_AMD_gpu_shader_int64 */ + +/* ---------------------- GL_AMD_interleaved_elements ---------------------- */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 + +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RG8UI 0x8238 +#define GL_RG16UI 0x823A +#define GL_RGBA8UI 0x8D7C +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); + +#define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) + +#define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) + +#endif /* GL_AMD_interleaved_elements */ + +/* ----------------------- 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_occlusion_query_event --------------------- */ + +#ifndef GL_AMD_occlusion_query_event +#define GL_AMD_occlusion_query_event 1 + +#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_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); + +#define glQueryObjectParameteruiAMD GLEW_GET_FUN(__glewQueryObjectParameteruiAMD) + +#define GLEW_AMD_occlusion_query_event GLEW_GET_VAR(__GLEW_AMD_occlusion_query_event) + +#endif /* GL_AMD_occlusion_query_event */ + +/* ----------------------- GL_AMD_performance_monitor ---------------------- */ + +#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 (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, GLchar *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, GLchar *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_pinned_memory ------------------------- */ + +#ifndef GL_AMD_pinned_memory +#define GL_AMD_pinned_memory 1 + +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 + +#define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory) + +#endif /* GL_AMD_pinned_memory */ + +/* ----------------------- GL_AMD_program_binary_Z400 ---------------------- */ + +#ifndef GL_AMD_program_binary_Z400 +#define GL_AMD_program_binary_Z400 1 + +#define GL_Z400_BINARY_AMD 0x8740 + +#define GLEW_AMD_program_binary_Z400 GLEW_GET_VAR(__GLEW_AMD_program_binary_Z400) + +#endif /* GL_AMD_program_binary_Z400 */ + +/* ----------------------- GL_AMD_query_buffer_object ---------------------- */ + +#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 + +#define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object) + +#endif /* GL_AMD_query_buffer_object */ + +/* ------------------------ 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 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_atomic_counter_ops ------------------- */ + +#ifndef GL_AMD_shader_atomic_counter_ops +#define GL_AMD_shader_atomic_counter_ops 1 + +#define GLEW_AMD_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_AMD_shader_atomic_counter_ops) + +#endif /* GL_AMD_shader_atomic_counter_ops */ + +/* -------------------------- GL_AMD_shader_ballot ------------------------- */ + +#ifndef GL_AMD_shader_ballot +#define GL_AMD_shader_ballot 1 + +#define GLEW_AMD_shader_ballot GLEW_GET_VAR(__GLEW_AMD_shader_ballot) + +#endif /* GL_AMD_shader_ballot */ + +/* ---------------- GL_AMD_shader_explicit_vertex_parameter ---------------- */ + +#ifndef GL_AMD_shader_explicit_vertex_parameter +#define GL_AMD_shader_explicit_vertex_parameter 1 + +#define GLEW_AMD_shader_explicit_vertex_parameter GLEW_GET_VAR(__GLEW_AMD_shader_explicit_vertex_parameter) + +#endif /* GL_AMD_shader_explicit_vertex_parameter */ + +/* ---------------------- 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_shader_stencil_value_export ------------------ */ + +#ifndef GL_AMD_shader_stencil_value_export +#define GL_AMD_shader_stencil_value_export 1 + +#define GLEW_AMD_shader_stencil_value_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_value_export) + +#endif /* GL_AMD_shader_stencil_value_export */ + +/* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 + +#define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) + +#endif /* GL_AMD_shader_trinary_minmax */ + +/* ------------------------- GL_AMD_sparse_texture ------------------------- */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 + +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +#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 + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); + +#define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) +#define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) + +#define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) + +#endif /* GL_AMD_sparse_texture */ + +/* ------------------- GL_AMD_stencil_operation_extended ------------------- */ + +#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 (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); + +#define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD) + +#define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended) + +#endif /* GL_AMD_stencil_operation_extended */ + +/* --------------------- GL_AMD_texture_gather_bias_lod -------------------- */ + +#ifndef GL_AMD_texture_gather_bias_lod +#define GL_AMD_texture_gather_bias_lod 1 + +#define GLEW_AMD_texture_gather_bias_lod GLEW_GET_VAR(__GLEW_AMD_texture_gather_bias_lod) + +#endif /* GL_AMD_texture_gather_bias_lod */ + +/* ------------------------ 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_transform_feedback4 ---------------------- */ + +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 + +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 + +#define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4) + +#endif /* GL_AMD_transform_feedback4 */ + +/* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ + +#ifndef GL_AMD_vertex_shader_layer +#define GL_AMD_vertex_shader_layer 1 + +#define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer) + +#endif /* GL_AMD_vertex_shader_layer */ + +/* -------------------- 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_AMD_vertex_shader_viewport_index ------------------ */ + +#ifndef GL_AMD_vertex_shader_viewport_index +#define GL_AMD_vertex_shader_viewport_index 1 + +#define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index) + +#endif /* GL_AMD_vertex_shader_viewport_index */ + +/* -------------------- GL_ANDROID_extension_pack_es31a -------------------- */ + +#ifndef GL_ANDROID_extension_pack_es31a +#define GL_ANDROID_extension_pack_es31a 1 + +#define GLEW_ANDROID_extension_pack_es31a GLEW_GET_VAR(__GLEW_ANDROID_extension_pack_es31a) + +#endif /* GL_ANDROID_extension_pack_es31a */ + +/* ------------------------- GL_ANGLE_depth_texture ------------------------ */ + +#ifndef GL_ANGLE_depth_texture +#define GL_ANGLE_depth_texture 1 + +#define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) + +#endif /* GL_ANGLE_depth_texture */ + +/* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ + +#ifndef GL_ANGLE_framebuffer_blit +#define GL_ANGLE_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) + +#define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) + +#endif /* GL_ANGLE_framebuffer_blit */ + +/* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ + +#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 (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) + +#define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) + +#endif /* GL_ANGLE_framebuffer_multisample */ + +/* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ + +#ifndef GL_ANGLE_instanced_arrays +#define GL_ANGLE_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); + +#define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) +#define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) +#define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) + +#define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) + +#endif /* GL_ANGLE_instanced_arrays */ + +/* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ + +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_ANGLE_pack_reverse_row_order 1 + +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 + +#define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) + +#endif /* GL_ANGLE_pack_reverse_row_order */ + +/* ------------------------ GL_ANGLE_program_binary ------------------------ */ + +#ifndef GL_ANGLE_program_binary +#define GL_ANGLE_program_binary 1 + +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 + +#define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) + +#endif /* GL_ANGLE_program_binary */ + +/* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt1 +#define GL_ANGLE_texture_compression_dxt1 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) + +#endif /* GL_ANGLE_texture_compression_dxt1 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_ANGLE_texture_compression_dxt3 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) + +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_ANGLE_texture_compression_dxt5 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) + +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +/* ------------------------- GL_ANGLE_texture_usage ------------------------ */ + +#ifndef GL_ANGLE_texture_usage +#define GL_ANGLE_texture_usage 1 + +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 + +#define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) + +#endif /* GL_ANGLE_texture_usage */ + +/* -------------------------- GL_ANGLE_timer_query ------------------------- */ + +#ifndef GL_ANGLE_timer_query +#define GL_ANGLE_timer_query 1 + +#define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 +#define GL_CURRENT_QUERY_ANGLE 0x8865 +#define GL_QUERY_RESULT_ANGLE 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 +#define GL_TIME_ELAPSED_ANGLE 0x88BF +#define GL_TIMESTAMP_ANGLE 0x8E28 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); + +#define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) +#define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) +#define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) +#define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) +#define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) +#define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) +#define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) +#define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) +#define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) +#define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) +#define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) + +#define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) + +#endif /* GL_ANGLE_timer_query */ + +/* ------------------- GL_ANGLE_translated_shader_source ------------------- */ + +#ifndef GL_ANGLE_translated_shader_source +#define GL_ANGLE_translated_shader_source 1 + +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 + +typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); + +#define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) + +#define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) + +#endif /* GL_ANGLE_translated_shader_source */ + +/* ----------------------- 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_clip_distance ------------------------ */ + +#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 + +#define GLEW_APPLE_clip_distance GLEW_GET_VAR(__GLEW_APPLE_clip_distance) + +#endif /* GL_APPLE_clip_distance */ + +/* ------------------- GL_APPLE_color_buffer_packed_float ------------------ */ + +#ifndef GL_APPLE_color_buffer_packed_float +#define GL_APPLE_color_buffer_packed_float 1 + +#define GLEW_APPLE_color_buffer_packed_float GLEW_GET_VAR(__GLEW_APPLE_color_buffer_packed_float) + +#endif /* GL_APPLE_color_buffer_packed_float */ + +/* ---------------------- GL_APPLE_copy_texture_levels --------------------- */ + +#ifndef GL_APPLE_copy_texture_levels +#define GL_APPLE_copy_texture_levels 1 + +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); + +#define glCopyTextureLevelsAPPLE GLEW_GET_FUN(__glewCopyTextureLevelsAPPLE) + +#define GLEW_APPLE_copy_texture_levels GLEW_GET_VAR(__GLEW_APPLE_copy_texture_levels) + +#endif /* GL_APPLE_copy_texture_levels */ + +/* ------------------------- 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_framebuffer_multisample ------------------- */ + +#ifndef GL_APPLE_framebuffer_multisample +#define GL_APPLE_framebuffer_multisample 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA +#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 +#define GL_MAX_SAMPLES_APPLE 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); + +#define glRenderbufferStorageMultisampleAPPLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleAPPLE) +#define glResolveMultisampleFramebufferAPPLE GLEW_GET_FUN(__glewResolveMultisampleFramebufferAPPLE) + +#define GLEW_APPLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_APPLE_framebuffer_multisample) + +#endif /* GL_APPLE_framebuffer_multisample */ + +/* ----------------------- 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 GL_RGB_RAW_422_APPLE 0x8A51 + +#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_sync ----------------------------- */ + +#ifndef GL_APPLE_sync +#define GL_APPLE_sync 1 + +#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 +#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_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull + +typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAPIENTRY * PFNGLDELETESYNCAPPLEPROC) (GLsync GLsync); +typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETSYNCIVAPPLEPROC) (GLsync GLsync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); +typedef GLboolean (GLAPIENTRY * PFNGLISSYNCAPPLEPROC) (GLsync GLsync); +typedef void (GLAPIENTRY * PFNGLWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); + +#define glClientWaitSyncAPPLE GLEW_GET_FUN(__glewClientWaitSyncAPPLE) +#define glDeleteSyncAPPLE GLEW_GET_FUN(__glewDeleteSyncAPPLE) +#define glFenceSyncAPPLE GLEW_GET_FUN(__glewFenceSyncAPPLE) +#define glGetInteger64vAPPLE GLEW_GET_FUN(__glewGetInteger64vAPPLE) +#define glGetSyncivAPPLE GLEW_GET_FUN(__glewGetSyncivAPPLE) +#define glIsSyncAPPLE GLEW_GET_FUN(__glewIsSyncAPPLE) +#define glWaitSyncAPPLE GLEW_GET_FUN(__glewWaitSyncAPPLE) + +#define GLEW_APPLE_sync GLEW_GET_VAR(__GLEW_APPLE_sync) + +#endif /* GL_APPLE_sync */ + +/* -------------------- GL_APPLE_texture_2D_limited_npot ------------------- */ + +#ifndef GL_APPLE_texture_2D_limited_npot +#define GL_APPLE_texture_2D_limited_npot 1 + +#define GLEW_APPLE_texture_2D_limited_npot GLEW_GET_VAR(__GLEW_APPLE_texture_2D_limited_npot) + +#endif /* GL_APPLE_texture_2D_limited_npot */ + +/* -------------------- GL_APPLE_texture_format_BGRA8888 ------------------- */ + +#ifndef GL_APPLE_texture_format_BGRA8888 +#define GL_APPLE_texture_format_BGRA8888 1 + +#define GL_BGRA_EXT 0x80E1 +#define GL_BGRA8_EXT 0x93A1 + +#define GLEW_APPLE_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_APPLE_texture_format_BGRA8888) + +#endif /* GL_APPLE_texture_format_BGRA8888 */ + +/* ----------------------- GL_APPLE_texture_max_level ---------------------- */ + +#ifndef GL_APPLE_texture_max_level +#define GL_APPLE_texture_max_level 1 + +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D + +#define GLEW_APPLE_texture_max_level GLEW_GET_VAR(__GLEW_APPLE_texture_max_level) + +#endif /* GL_APPLE_texture_max_level */ + +/* --------------------- GL_APPLE_texture_packed_float --------------------- */ + +#ifndef GL_APPLE_texture_packed_float +#define GL_APPLE_texture_packed_float 1 + +#define GL_R11F_G11F_B10F_APPLE 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B +#define GL_RGB9_E5_APPLE 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E + +#define GLEW_APPLE_texture_packed_float GLEW_GET_VAR(__GLEW_APPLE_texture_packed_float) + +#endif /* GL_APPLE_texture_packed_float */ + +/* ------------------------- 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, void **params); +typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, void *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 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_RGB565 0x8D62 +#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 int GLfixed; + +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 void*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_ES3_1_compatibility ---------------------- */ + +#ifndef GL_ARB_ES3_1_compatibility +#define GL_ARB_ES3_1_compatibility 1 + +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); + +#define glMemoryBarrierByRegion GLEW_GET_FUN(__glewMemoryBarrierByRegion) + +#define GLEW_ARB_ES3_1_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_1_compatibility) + +#endif /* GL_ARB_ES3_1_compatibility */ + +/* ----------------------- GL_ARB_ES3_2_compatibility ---------------------- */ + +#ifndef GL_ARB_ES3_2_compatibility +#define GL_ARB_ES3_2_compatibility 1 + +#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE +#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 +#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); + +#define glPrimitiveBoundingBoxARB GLEW_GET_FUN(__glewPrimitiveBoundingBoxARB) + +#define GLEW_ARB_ES3_2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_2_compatibility) + +#endif /* GL_ARB_ES3_2_compatibility */ + +/* ------------------------ GL_ARB_ES3_compatibility ----------------------- */ + +#ifndef GL_ARB_ES3_compatibility +#define GL_ARB_ES3_compatibility 1 + +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#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 GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility) + +#endif /* GL_ARB_ES3_compatibility */ + +/* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */ + +#ifndef GL_ARB_arrays_of_arrays +#define GL_ARB_arrays_of_arrays 1 + +#define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays) + +#endif /* GL_ARB_arrays_of_arrays */ + +/* -------------------------- 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_bindless_texture ------------------------ */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 + +#define GL_UNSIGNED_INT64_ARB 0x140F + +typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); +typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); + +#define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) +#define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) +#define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) +#define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) +#define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) +#define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) +#define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) +#define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) +#define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) +#define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) +#define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) +#define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) +#define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) +#define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) +#define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) +#define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) + +#define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) + +#endif /* GL_ARB_bindless_texture */ + +/* ----------------------- 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 GLchar * name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * 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_buffer_storage ------------------------- */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_PERSISTENT_BIT 0x00000040 +#define GL_MAP_COHERENT_BIT 0x00000080 +#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 + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); + +#define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) + +#define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) + +#endif /* GL_ARB_buffer_storage */ + +/* ---------------------------- 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_clear_buffer_object ---------------------- */ + +#ifndef GL_ARB_clear_buffer_object +#define GL_ARB_clear_buffer_object 1 + +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); + +#define glClearBufferData GLEW_GET_FUN(__glewClearBufferData) +#define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData) +#define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT) +#define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT) + +#define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object) + +#endif /* GL_ARB_clear_buffer_object */ + +/* -------------------------- GL_ARB_clear_texture ------------------------- */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 + +#define GL_CLEAR_TEXTURE 0x9365 + +typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); + +#define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) +#define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) + +#define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) + +#endif /* GL_ARB_clear_texture */ + +/* -------------------------- GL_ARB_clip_control -------------------------- */ + +#ifndef GL_ARB_clip_control +#define GL_ARB_clip_control 1 + +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_ZERO_TO_ONE 0x935F + +typedef void (GLAPIENTRY * PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); + +#define glClipControl GLEW_GET_FUN(__glewClipControl) + +#define GLEW_ARB_clip_control GLEW_GET_VAR(__GLEW_ARB_clip_control) + +#endif /* GL_ARB_clip_control */ + +/* ----------------------- 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_compute_shader ------------------------- */ + +#ifndef GL_ARB_compute_shader +#define GL_ARB_compute_shader 1 + +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#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_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#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 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_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF + +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); + +#define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute) +#define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect) + +#define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader) + +#endif /* GL_ARB_compute_shader */ + +/* ------------------- GL_ARB_compute_variable_group_size ------------------ */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 + +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 + +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); + +#define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) + +#define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) + +#endif /* GL_ARB_compute_variable_group_size */ + +/* ------------------- GL_ARB_conditional_render_inverted ------------------ */ + +#ifndef GL_ARB_conditional_render_inverted +#define GL_ARB_conditional_render_inverted 1 + +#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 GLEW_ARB_conditional_render_inverted GLEW_GET_VAR(__GLEW_ARB_conditional_render_inverted) + +#endif /* GL_ARB_conditional_render_inverted */ + +/* ----------------------- 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_copy_image --------------------------- */ + +#ifndef GL_ARB_copy_image +#define GL_ARB_copy_image 1 + +typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); + +#define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData) + +#define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image) + +#endif /* GL_ARB_copy_image */ + +/* -------------------------- GL_ARB_cull_distance ------------------------- */ + +#ifndef GL_ARB_cull_distance +#define GL_ARB_cull_distance 1 + +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA + +#define GLEW_ARB_cull_distance GLEW_GET_VAR(__GLEW_ARB_cull_distance) + +#endif /* GL_ARB_cull_distance */ + +/* -------------------------- 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 (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const 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 GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* 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_derivative_control ----------------------- */ + +#ifndef GL_ARB_derivative_control +#define GL_ARB_derivative_control 1 + +#define GLEW_ARB_derivative_control GLEW_GET_VAR(__GLEW_ARB_derivative_control) + +#endif /* GL_ARB_derivative_control */ + +/* ----------------------- GL_ARB_direct_state_access ---------------------- */ + +#ifndef GL_ARB_direct_state_access +#define GL_ARB_direct_state_access 1 + +#define GL_TEXTURE_TARGET 0x1006 +#define GL_QUERY_TARGET 0x82EA + +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); +typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures); +typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments); +typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); + +#define glBindTextureUnit GLEW_GET_FUN(__glewBindTextureUnit) +#define glBlitNamedFramebuffer GLEW_GET_FUN(__glewBlitNamedFramebuffer) +#define glCheckNamedFramebufferStatus GLEW_GET_FUN(__glewCheckNamedFramebufferStatus) +#define glClearNamedBufferData GLEW_GET_FUN(__glewClearNamedBufferData) +#define glClearNamedBufferSubData GLEW_GET_FUN(__glewClearNamedBufferSubData) +#define glClearNamedFramebufferfi GLEW_GET_FUN(__glewClearNamedFramebufferfi) +#define glClearNamedFramebufferfv GLEW_GET_FUN(__glewClearNamedFramebufferfv) +#define glClearNamedFramebufferiv GLEW_GET_FUN(__glewClearNamedFramebufferiv) +#define glClearNamedFramebufferuiv GLEW_GET_FUN(__glewClearNamedFramebufferuiv) +#define glCompressedTextureSubImage1D GLEW_GET_FUN(__glewCompressedTextureSubImage1D) +#define glCompressedTextureSubImage2D GLEW_GET_FUN(__glewCompressedTextureSubImage2D) +#define glCompressedTextureSubImage3D GLEW_GET_FUN(__glewCompressedTextureSubImage3D) +#define glCopyNamedBufferSubData GLEW_GET_FUN(__glewCopyNamedBufferSubData) +#define glCopyTextureSubImage1D GLEW_GET_FUN(__glewCopyTextureSubImage1D) +#define glCopyTextureSubImage2D GLEW_GET_FUN(__glewCopyTextureSubImage2D) +#define glCopyTextureSubImage3D GLEW_GET_FUN(__glewCopyTextureSubImage3D) +#define glCreateBuffers GLEW_GET_FUN(__glewCreateBuffers) +#define glCreateFramebuffers GLEW_GET_FUN(__glewCreateFramebuffers) +#define glCreateProgramPipelines GLEW_GET_FUN(__glewCreateProgramPipelines) +#define glCreateQueries GLEW_GET_FUN(__glewCreateQueries) +#define glCreateRenderbuffers GLEW_GET_FUN(__glewCreateRenderbuffers) +#define glCreateSamplers GLEW_GET_FUN(__glewCreateSamplers) +#define glCreateTextures GLEW_GET_FUN(__glewCreateTextures) +#define glCreateTransformFeedbacks GLEW_GET_FUN(__glewCreateTransformFeedbacks) +#define glCreateVertexArrays GLEW_GET_FUN(__glewCreateVertexArrays) +#define glDisableVertexArrayAttrib GLEW_GET_FUN(__glewDisableVertexArrayAttrib) +#define glEnableVertexArrayAttrib GLEW_GET_FUN(__glewEnableVertexArrayAttrib) +#define glFlushMappedNamedBufferRange GLEW_GET_FUN(__glewFlushMappedNamedBufferRange) +#define glGenerateTextureMipmap GLEW_GET_FUN(__glewGenerateTextureMipmap) +#define glGetCompressedTextureImage GLEW_GET_FUN(__glewGetCompressedTextureImage) +#define glGetNamedBufferParameteri64v GLEW_GET_FUN(__glewGetNamedBufferParameteri64v) +#define glGetNamedBufferParameteriv GLEW_GET_FUN(__glewGetNamedBufferParameteriv) +#define glGetNamedBufferPointerv GLEW_GET_FUN(__glewGetNamedBufferPointerv) +#define glGetNamedBufferSubData GLEW_GET_FUN(__glewGetNamedBufferSubData) +#define glGetNamedFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameteriv) +#define glGetNamedFramebufferParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferParameteriv) +#define glGetNamedRenderbufferParameteriv GLEW_GET_FUN(__glewGetNamedRenderbufferParameteriv) +#define glGetQueryBufferObjecti64v GLEW_GET_FUN(__glewGetQueryBufferObjecti64v) +#define glGetQueryBufferObjectiv GLEW_GET_FUN(__glewGetQueryBufferObjectiv) +#define glGetQueryBufferObjectui64v GLEW_GET_FUN(__glewGetQueryBufferObjectui64v) +#define glGetQueryBufferObjectuiv GLEW_GET_FUN(__glewGetQueryBufferObjectuiv) +#define glGetTextureImage GLEW_GET_FUN(__glewGetTextureImage) +#define glGetTextureLevelParameterfv GLEW_GET_FUN(__glewGetTextureLevelParameterfv) +#define glGetTextureLevelParameteriv GLEW_GET_FUN(__glewGetTextureLevelParameteriv) +#define glGetTextureParameterIiv GLEW_GET_FUN(__glewGetTextureParameterIiv) +#define glGetTextureParameterIuiv GLEW_GET_FUN(__glewGetTextureParameterIuiv) +#define glGetTextureParameterfv GLEW_GET_FUN(__glewGetTextureParameterfv) +#define glGetTextureParameteriv GLEW_GET_FUN(__glewGetTextureParameteriv) +#define glGetTransformFeedbacki64_v GLEW_GET_FUN(__glewGetTransformFeedbacki64_v) +#define glGetTransformFeedbacki_v GLEW_GET_FUN(__glewGetTransformFeedbacki_v) +#define glGetTransformFeedbackiv GLEW_GET_FUN(__glewGetTransformFeedbackiv) +#define glGetVertexArrayIndexed64iv GLEW_GET_FUN(__glewGetVertexArrayIndexed64iv) +#define glGetVertexArrayIndexediv GLEW_GET_FUN(__glewGetVertexArrayIndexediv) +#define glGetVertexArrayiv GLEW_GET_FUN(__glewGetVertexArrayiv) +#define glInvalidateNamedFramebufferData GLEW_GET_FUN(__glewInvalidateNamedFramebufferData) +#define glInvalidateNamedFramebufferSubData GLEW_GET_FUN(__glewInvalidateNamedFramebufferSubData) +#define glMapNamedBuffer GLEW_GET_FUN(__glewMapNamedBuffer) +#define glMapNamedBufferRange GLEW_GET_FUN(__glewMapNamedBufferRange) +#define glNamedBufferData GLEW_GET_FUN(__glewNamedBufferData) +#define glNamedBufferStorage GLEW_GET_FUN(__glewNamedBufferStorage) +#define glNamedBufferSubData GLEW_GET_FUN(__glewNamedBufferSubData) +#define glNamedFramebufferDrawBuffer GLEW_GET_FUN(__glewNamedFramebufferDrawBuffer) +#define glNamedFramebufferDrawBuffers GLEW_GET_FUN(__glewNamedFramebufferDrawBuffers) +#define glNamedFramebufferParameteri GLEW_GET_FUN(__glewNamedFramebufferParameteri) +#define glNamedFramebufferReadBuffer GLEW_GET_FUN(__glewNamedFramebufferReadBuffer) +#define glNamedFramebufferRenderbuffer GLEW_GET_FUN(__glewNamedFramebufferRenderbuffer) +#define glNamedFramebufferTexture GLEW_GET_FUN(__glewNamedFramebufferTexture) +#define glNamedFramebufferTextureLayer GLEW_GET_FUN(__glewNamedFramebufferTextureLayer) +#define glNamedRenderbufferStorage GLEW_GET_FUN(__glewNamedRenderbufferStorage) +#define glNamedRenderbufferStorageMultisample GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisample) +#define glTextureBuffer GLEW_GET_FUN(__glewTextureBuffer) +#define glTextureBufferRange GLEW_GET_FUN(__glewTextureBufferRange) +#define glTextureParameterIiv GLEW_GET_FUN(__glewTextureParameterIiv) +#define glTextureParameterIuiv GLEW_GET_FUN(__glewTextureParameterIuiv) +#define glTextureParameterf GLEW_GET_FUN(__glewTextureParameterf) +#define glTextureParameterfv GLEW_GET_FUN(__glewTextureParameterfv) +#define glTextureParameteri GLEW_GET_FUN(__glewTextureParameteri) +#define glTextureParameteriv GLEW_GET_FUN(__glewTextureParameteriv) +#define glTextureStorage1D GLEW_GET_FUN(__glewTextureStorage1D) +#define glTextureStorage2D GLEW_GET_FUN(__glewTextureStorage2D) +#define glTextureStorage2DMultisample GLEW_GET_FUN(__glewTextureStorage2DMultisample) +#define glTextureStorage3D GLEW_GET_FUN(__glewTextureStorage3D) +#define glTextureStorage3DMultisample GLEW_GET_FUN(__glewTextureStorage3DMultisample) +#define glTextureSubImage1D GLEW_GET_FUN(__glewTextureSubImage1D) +#define glTextureSubImage2D GLEW_GET_FUN(__glewTextureSubImage2D) +#define glTextureSubImage3D GLEW_GET_FUN(__glewTextureSubImage3D) +#define glTransformFeedbackBufferBase GLEW_GET_FUN(__glewTransformFeedbackBufferBase) +#define glTransformFeedbackBufferRange GLEW_GET_FUN(__glewTransformFeedbackBufferRange) +#define glUnmapNamedBuffer GLEW_GET_FUN(__glewUnmapNamedBuffer) +#define glVertexArrayAttribBinding GLEW_GET_FUN(__glewVertexArrayAttribBinding) +#define glVertexArrayAttribFormat GLEW_GET_FUN(__glewVertexArrayAttribFormat) +#define glVertexArrayAttribIFormat GLEW_GET_FUN(__glewVertexArrayAttribIFormat) +#define glVertexArrayAttribLFormat GLEW_GET_FUN(__glewVertexArrayAttribLFormat) +#define glVertexArrayBindingDivisor GLEW_GET_FUN(__glewVertexArrayBindingDivisor) +#define glVertexArrayElementBuffer GLEW_GET_FUN(__glewVertexArrayElementBuffer) +#define glVertexArrayVertexBuffer GLEW_GET_FUN(__glewVertexArrayVertexBuffer) +#define glVertexArrayVertexBuffers GLEW_GET_FUN(__glewVertexArrayVertexBuffers) + +#define GLEW_ARB_direct_state_access GLEW_GET_VAR(__GLEW_ARB_direct_state_access) + +#endif /* GL_ARB_direct_state_access */ + +/* -------------------------- 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, void**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_enhanced_layouts ------------------------ */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 + +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C + +#define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) + +#endif /* GL_ARB_enhanced_layouts */ + +/* -------------------- 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_explicit_uniform_location ------------------- */ + +#ifndef GL_ARB_explicit_uniform_location +#define GL_ARB_explicit_uniform_location 1 + +#define GL_MAX_UNIFORM_LOCATIONS 0x826E + +#define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location) + +#endif /* GL_ARB_explicit_uniform_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_layer_viewport -------------------- */ + +#ifndef GL_ARB_fragment_layer_viewport +#define GL_ARB_fragment_layer_viewport 1 + +#define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport) + +#endif /* GL_ARB_fragment_layer_viewport */ + +/* ------------------------ 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_fragment_shader_interlock ------------------- */ + +#ifndef GL_ARB_fragment_shader_interlock +#define GL_ARB_fragment_shader_interlock 1 + +#define GLEW_ARB_fragment_shader_interlock GLEW_GET_VAR(__GLEW_ARB_fragment_shader_interlock) + +#endif /* GL_ARB_fragment_shader_interlock */ + +/* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */ + +#ifndef GL_ARB_framebuffer_no_attachments +#define GL_ARB_framebuffer_no_attachments 1 + +#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 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); + +#define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri) +#define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv) +#define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT) +#define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT) + +#define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments) + +#endif /* GL_ARB_framebuffer_no_attachments */ + +/* ----------------------- 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, void*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_get_texture_sub_image --------------------- */ + +#ifndef GL_ARB_get_texture_sub_image +#define GL_ARB_get_texture_sub_image 1 + +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); + +#define glGetCompressedTextureSubImage GLEW_GET_FUN(__glewGetCompressedTextureSubImage) +#define glGetTextureSubImage GLEW_GET_FUN(__glewGetTextureSubImage) + +#define GLEW_ARB_get_texture_sub_image GLEW_GET_VAR(__GLEW_ARB_get_texture_sub_image) + +#endif /* GL_ARB_get_texture_sub_image */ + +/* ---------------------------- GL_ARB_gl_spirv ---------------------------- */ + +#ifndef GL_ARB_gl_spirv +#define GL_ARB_gl_spirv 1 + +#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 +#define GL_SPIR_V_BINARY_ARB 0x9552 + +typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue); + +#define glSpecializeShaderARB GLEW_GET_FUN(__glewSpecializeShaderARB) + +#define GLEW_ARB_gl_spirv GLEW_GET_VAR(__GLEW_ARB_gl_spirv) + +#endif /* GL_ARB_gl_spirv */ + +/* --------------------------- 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 * 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 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_gpu_shader_int64 ------------------------ */ + +#ifndef GL_ARB_gpu_shader_int64 +#define GL_ARB_gpu_shader_int64 1 + +#define GL_INT64_ARB 0x140E +#define GL_UNSIGNED_INT64_ARB 0x140F +#define GL_INT64_VEC2_ARB 0x8FE9 +#define GL_INT64_VEC3_ARB 0x8FEA +#define GL_INT64_VEC4_ARB 0x8FEB +#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); + +#define glGetUniformi64vARB GLEW_GET_FUN(__glewGetUniformi64vARB) +#define glGetUniformui64vARB GLEW_GET_FUN(__glewGetUniformui64vARB) +#define glGetnUniformi64vARB GLEW_GET_FUN(__glewGetnUniformi64vARB) +#define glGetnUniformui64vARB GLEW_GET_FUN(__glewGetnUniformui64vARB) +#define glProgramUniform1i64ARB GLEW_GET_FUN(__glewProgramUniform1i64ARB) +#define glProgramUniform1i64vARB GLEW_GET_FUN(__glewProgramUniform1i64vARB) +#define glProgramUniform1ui64ARB GLEW_GET_FUN(__glewProgramUniform1ui64ARB) +#define glProgramUniform1ui64vARB GLEW_GET_FUN(__glewProgramUniform1ui64vARB) +#define glProgramUniform2i64ARB GLEW_GET_FUN(__glewProgramUniform2i64ARB) +#define glProgramUniform2i64vARB GLEW_GET_FUN(__glewProgramUniform2i64vARB) +#define glProgramUniform2ui64ARB GLEW_GET_FUN(__glewProgramUniform2ui64ARB) +#define glProgramUniform2ui64vARB GLEW_GET_FUN(__glewProgramUniform2ui64vARB) +#define glProgramUniform3i64ARB GLEW_GET_FUN(__glewProgramUniform3i64ARB) +#define glProgramUniform3i64vARB GLEW_GET_FUN(__glewProgramUniform3i64vARB) +#define glProgramUniform3ui64ARB GLEW_GET_FUN(__glewProgramUniform3ui64ARB) +#define glProgramUniform3ui64vARB GLEW_GET_FUN(__glewProgramUniform3ui64vARB) +#define glProgramUniform4i64ARB GLEW_GET_FUN(__glewProgramUniform4i64ARB) +#define glProgramUniform4i64vARB GLEW_GET_FUN(__glewProgramUniform4i64vARB) +#define glProgramUniform4ui64ARB GLEW_GET_FUN(__glewProgramUniform4ui64ARB) +#define glProgramUniform4ui64vARB GLEW_GET_FUN(__glewProgramUniform4ui64vARB) +#define glUniform1i64ARB GLEW_GET_FUN(__glewUniform1i64ARB) +#define glUniform1i64vARB GLEW_GET_FUN(__glewUniform1i64vARB) +#define glUniform1ui64ARB GLEW_GET_FUN(__glewUniform1ui64ARB) +#define glUniform1ui64vARB GLEW_GET_FUN(__glewUniform1ui64vARB) +#define glUniform2i64ARB GLEW_GET_FUN(__glewUniform2i64ARB) +#define glUniform2i64vARB GLEW_GET_FUN(__glewUniform2i64vARB) +#define glUniform2ui64ARB GLEW_GET_FUN(__glewUniform2ui64ARB) +#define glUniform2ui64vARB GLEW_GET_FUN(__glewUniform2ui64vARB) +#define glUniform3i64ARB GLEW_GET_FUN(__glewUniform3i64ARB) +#define glUniform3i64vARB GLEW_GET_FUN(__glewUniform3i64vARB) +#define glUniform3ui64ARB GLEW_GET_FUN(__glewUniform3ui64ARB) +#define glUniform3ui64vARB GLEW_GET_FUN(__glewUniform3ui64vARB) +#define glUniform4i64ARB GLEW_GET_FUN(__glewUniform4i64ARB) +#define glUniform4i64vARB GLEW_GET_FUN(__glewUniform4i64vARB) +#define glUniform4ui64ARB GLEW_GET_FUN(__glewUniform4ui64ARB) +#define glUniform4ui64vARB GLEW_GET_FUN(__glewUniform4ui64vARB) + +#define GLEW_ARB_gpu_shader_int64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_int64) + +#endif /* GL_ARB_gpu_shader_int64 */ + +/* ------------------------ 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 void *data); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *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 void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *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, void *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, void *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, void *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, void *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, void *row, void *column, void *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 void *row, const void *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_indirect_parameters ---------------------- */ + +#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 (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); + +#define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) +#define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) + +#define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) + +#endif /* GL_ARB_indirect_parameters */ + +/* ------------------------ 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_internalformat_query2 --------------------- */ + +#ifndef GL_ARB_internalformat_query2 +#define GL_ARB_internalformat_query2 1 + +#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 + +typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); + +#define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v) + +#define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2) + +#endif /* GL_ARB_internalformat_query2 */ + +/* ----------------------- GL_ARB_invalidate_subdata ----------------------- */ + +#ifndef GL_ARB_invalidate_subdata +#define GL_ARB_invalidate_subdata 1 + +typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); +typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); + +#define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData) +#define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData) +#define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer) +#define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer) +#define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage) +#define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage) + +#define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata) + +#endif /* GL_ARB_invalidate_subdata */ + +/* ---------------------- 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 void * (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, void *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_multi_bind --------------------------- */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); + +#define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) +#define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) +#define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) +#define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) +#define glBindTextures GLEW_GET_FUN(__glewBindTextures) +#define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) + +#define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) + +#endif /* GL_ARB_multi_bind */ + +/* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ + +#ifndef GL_ARB_multi_draw_indirect +#define GL_ARB_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); + +#define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) +#define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) + +#define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect) + +#endif /* GL_ARB_multi_draw_indirect */ + +/* --------------------------- 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_parallel_shader_compile -------------------- */ + +#ifndef GL_ARB_parallel_shader_compile +#define GL_ARB_parallel_shader_compile 1 + +#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 +#define GL_COMPLETION_STATUS_ARB 0x91B1 + +typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); + +#define glMaxShaderCompilerThreadsARB GLEW_GET_FUN(__glewMaxShaderCompilerThreadsARB) + +#define GLEW_ARB_parallel_shader_compile GLEW_GET_VAR(__GLEW_ARB_parallel_shader_compile) + +#endif /* GL_ARB_parallel_shader_compile */ + +/* -------------------- GL_ARB_pipeline_statistics_query ------------------- */ + +#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 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F + +#define GLEW_ARB_pipeline_statistics_query GLEW_GET_VAR(__GLEW_ARB_pipeline_statistics_query) + +#endif /* GL_ARB_pipeline_statistics_query */ + +/* ----------------------- 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_polygon_offset_clamp ---------------------- */ + +#ifndef GL_ARB_polygon_offset_clamp +#define GL_ARB_polygon_offset_clamp 1 + +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); + +#define glPolygonOffsetClamp GLEW_GET_FUN(__glewPolygonOffsetClamp) + +#define GLEW_ARB_polygon_offset_clamp GLEW_GET_VAR(__GLEW_ARB_polygon_offset_clamp) + +#endif /* GL_ARB_polygon_offset_clamp */ + +/* ----------------------- GL_ARB_post_depth_coverage ---------------------- */ + +#ifndef GL_ARB_post_depth_coverage +#define GL_ARB_post_depth_coverage 1 + +#define GLEW_ARB_post_depth_coverage GLEW_GET_VAR(__GLEW_ARB_post_depth_coverage) + +#endif /* GL_ARB_post_depth_coverage */ + +/* --------------------- GL_ARB_program_interface_query -------------------- */ + +#ifndef GL_ARB_program_interface_query +#define GL_ARB_program_interface_query 1 + +#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_IS_PER_PATCH 0x92E7 +#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 + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params); +typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params); + +#define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv) +#define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex) +#define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation) +#define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex) +#define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName) +#define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv) + +#define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query) + +#endif /* GL_ARB_program_interface_query */ + +/* ------------------------ 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_query_buffer_object ---------------------- */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 + +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 + +#define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) + +#endif /* GL_ARB_query_buffer_object */ + +/* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ + +#ifndef GL_ARB_robust_buffer_access_behavior +#define GL_ARB_robust_buffer_access_behavior 1 + +#define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior) + +#endif /* GL_ARB_robust_buffer_access_behavior */ + +/* --------------------------- 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, void*column, void*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_robustness_application_isolation ---------------- */ + +#ifndef GL_ARB_robustness_application_isolation +#define GL_ARB_robustness_application_isolation 1 + +#define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation) + +#endif /* GL_ARB_robustness_application_isolation */ + +/* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */ + +#ifndef GL_ARB_robustness_share_group_isolation +#define GL_ARB_robustness_share_group_isolation 1 + +#define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation) + +#endif /* GL_ARB_robustness_share_group_isolation */ + +/* ------------------------ GL_ARB_sample_locations ------------------------ */ + +#ifndef GL_ARB_sample_locations +#define GL_ARB_sample_locations 1 + +#define GL_SAMPLE_LOCATION_ARB 0x8E50 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); + +#define glFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewFramebufferSampleLocationsfvARB) +#define glNamedFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvARB) + +#define GLEW_ARB_sample_locations GLEW_GET_VAR(__GLEW_ARB_sample_locations) + +#endif /* GL_ARB_sample_locations */ + +/* ------------------------- 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_seamless_cubemap_per_texture ------------------ */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) + +#endif /* GL_ARB_seamless_cubemap_per_texture */ + +/* --------------------- 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 GLchar * const * 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, GLchar *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_counter_ops ------------------- */ + +#ifndef GL_ARB_shader_atomic_counter_ops +#define GL_ARB_shader_atomic_counter_ops 1 + +#define GLEW_ARB_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counter_ops) + +#endif /* GL_ARB_shader_atomic_counter_ops */ + +/* --------------------- 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_ballot ------------------------- */ + +#ifndef GL_ARB_shader_ballot +#define GL_ARB_shader_ballot 1 + +#define GLEW_ARB_shader_ballot GLEW_GET_VAR(__GLEW_ARB_shader_ballot) + +#endif /* GL_ARB_shader_ballot */ + +/* ----------------------- 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_clock -------------------------- */ + +#ifndef GL_ARB_shader_clock +#define GL_ARB_shader_clock 1 + +#define GLEW_ARB_shader_clock GLEW_GET_VAR(__GLEW_ARB_shader_clock) + +#endif /* GL_ARB_shader_clock */ + +/* --------------------- GL_ARB_shader_draw_parameters --------------------- */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 + +#define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) + +#endif /* GL_ARB_shader_draw_parameters */ + +/* ------------------------ GL_ARB_shader_group_vote ----------------------- */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 + +#define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) + +#endif /* GL_ARB_shader_group_vote */ + +/* --------------------- 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_image_size ----------------------- */ + +#ifndef GL_ARB_shader_image_size +#define GL_ARB_shader_image_size 1 + +#define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size) + +#endif /* GL_ARB_shader_image_size */ + +/* ------------------------- 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_storage_buffer_object ------------------ */ + +#ifndef GL_ARB_shader_storage_buffer_object +#define GL_ARB_shader_storage_buffer_object 1 + +#define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#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 + +typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); + +#define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding) + +#define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object) + +#endif /* GL_ARB_shader_storage_buffer_object */ + +/* ------------------------ 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, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *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 GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* 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_image_samples ------------------ */ + +#ifndef GL_ARB_shader_texture_image_samples +#define GL_ARB_shader_texture_image_samples 1 + +#define GLEW_ARB_shader_texture_image_samples GLEW_GET_VAR(__GLEW_ARB_shader_texture_image_samples) + +#endif /* GL_ARB_shader_texture_image_samples */ + +/* ----------------------- 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_shader_viewport_layer_array ------------------ */ + +#ifndef GL_ARB_shader_viewport_layer_array +#define GL_ARB_shader_viewport_layer_array 1 + +#define GLEW_ARB_shader_viewport_layer_array GLEW_GET_VAR(__GLEW_ARB_shader_viewport_layer_array) + +#endif /* GL_ARB_shader_viewport_layer_array */ + +/* ---------------------- 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 GLchar* const *path, const GLint *length); +typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *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_sparse_buffer ------------------------- */ + +#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 (GLAPIENTRY * PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); + +#define glBufferPageCommitmentARB GLEW_GET_FUN(__glewBufferPageCommitmentARB) + +#define GLEW_ARB_sparse_buffer GLEW_GET_VAR(__GLEW_ARB_sparse_buffer) + +#endif /* GL_ARB_sparse_buffer */ + +/* ------------------------- GL_ARB_sparse_texture ------------------------- */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 + +#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_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA + +typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + +#define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) + +#define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) + +#endif /* GL_ARB_sparse_texture */ + +/* ------------------------- GL_ARB_sparse_texture2 ------------------------ */ + +#ifndef GL_ARB_sparse_texture2 +#define GL_ARB_sparse_texture2 1 + +#define GLEW_ARB_sparse_texture2 GLEW_GET_VAR(__GLEW_ARB_sparse_texture2) + +#endif /* GL_ARB_sparse_texture2 */ + +/* ---------------------- GL_ARB_sparse_texture_clamp ---------------------- */ + +#ifndef GL_ARB_sparse_texture_clamp +#define GL_ARB_sparse_texture_clamp 1 + +#define GLEW_ARB_sparse_texture_clamp GLEW_GET_VAR(__GLEW_ARB_sparse_texture_clamp) + +#endif /* GL_ARB_sparse_texture_clamp */ + +/* ------------------------ GL_ARB_spirv_extensions ------------------------ */ + +#ifndef GL_ARB_spirv_extensions +#define GL_ARB_spirv_extensions 1 + +#define GL_SPIR_V_EXTENSIONS 0x9553 +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 + +#define GLEW_ARB_spirv_extensions GLEW_GET_VAR(__GLEW_ARB_spirv_extensions) + +#endif /* GL_ARB_spirv_extensions */ + +/* ------------------------ GL_ARB_stencil_texturing ----------------------- */ + +#ifndef GL_ARB_stencil_texturing +#define GL_ARB_stencil_texturing 1 + +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA + +#define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing) + +#endif /* GL_ARB_stencil_texturing */ + +/* ------------------------------ 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 0xFFFFFFFFFFFFFFFFull + +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_barrier ------------------------ */ + +#ifndef GL_ARB_texture_barrier +#define GL_ARB_texture_barrier 1 + +typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERPROC) (void); + +#define glTextureBarrier GLEW_GET_FUN(__glewTextureBarrier) + +#define GLEW_ARB_texture_barrier GLEW_GET_VAR(__GLEW_ARB_texture_barrier) + +#endif /* GL_ARB_texture_barrier */ + +/* ---------------------- 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_buffer_range ---------------------- */ + +#ifndef GL_ARB_texture_buffer_range +#define GL_ARB_texture_buffer_range 1 + +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F + +typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); + +#define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange) +#define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT) + +#define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range) + +#endif /* GL_ARB_texture_buffer_range */ + +/* ----------------------- 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_filter_anisotropic ------------------- */ + +#ifndef GL_ARB_texture_filter_anisotropic +#define GL_ARB_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF + +#define GLEW_ARB_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_ARB_texture_filter_anisotropic) + +#endif /* GL_ARB_texture_filter_anisotropic */ + +/* ---------------------- GL_ARB_texture_filter_minmax --------------------- */ + +#ifndef GL_ARB_texture_filter_minmax +#define GL_ARB_texture_filter_minmax 1 + +#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 +#define GL_WEIGHTED_AVERAGE_ARB 0x9367 + +#define GLEW_ARB_texture_filter_minmax GLEW_GET_VAR(__GLEW_ARB_texture_filter_minmax) + +#endif /* GL_ARB_texture_filter_minmax */ + +/* -------------------------- 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_mirror_clamp_to_edge ------------------ */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 + +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 + +#define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) + +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + +/* --------------------- 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, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum 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_levels ---------------------- */ + +#ifndef GL_ARB_texture_query_levels +#define GL_ARB_texture_query_levels 1 + +#define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels) + +#endif /* GL_ARB_texture_query_levels */ + +/* ------------------------ 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_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_stencil8 ------------------------ */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 + +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX8 0x8D48 + +#define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) + +#endif /* GL_ARB_texture_stencil8 */ + +/* ------------------------- GL_ARB_texture_storage ------------------------ */ + +#ifndef GL_ARB_texture_storage +#define GL_ARB_texture_storage 1 + +#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); + +#define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D) +#define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D) +#define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D) + +#define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage) + +#endif /* GL_ARB_texture_storage */ + +/* ------------------- GL_ARB_texture_storage_multisample ------------------ */ + +#ifndef GL_ARB_texture_storage_multisample +#define GL_ARB_texture_storage_multisample 1 + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +#define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample) +#define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample) +#define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT) +#define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT) + +#define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample) + +#endif /* GL_ARB_texture_storage_multisample */ + +/* ------------------------- 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_texture_view -------------------------- */ + +#ifndef GL_ARB_texture_view +#define GL_ARB_texture_view 1 + +#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 + +typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); + +#define glTextureView GLEW_GET_FUN(__glewTextureView) + +#define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view) + +#endif /* GL_ARB_texture_view */ + +/* --------------------------- 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_transform_feedback_overflow_query --------------- */ + +#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 + +#define GLEW_ARB_transform_feedback_overflow_query GLEW_GET_VAR(__GLEW_ARB_transform_feedback_overflow_query) + +#endif /* GL_ARB_transform_feedback_overflow_query */ + +/* ------------------------ 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 0xFFFFFFFFu + +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, GLchar* 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, GLchar* 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 GLchar* uniformBlockName); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const * 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 + +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_attrib_binding --------------------- */ + +#ifndef GL_ARB_vertex_attrib_binding +#define GL_ARB_vertex_attrib_binding 1 + +#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 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); + +#define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer) +#define glVertexArrayBindVertexBufferEXT GLEW_GET_FUN(__glewVertexArrayBindVertexBufferEXT) +#define glVertexArrayVertexAttribBindingEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribBindingEXT) +#define glVertexArrayVertexAttribFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribFormatEXT) +#define glVertexArrayVertexAttribIFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIFormatEXT) +#define glVertexArrayVertexAttribLFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLFormatEXT) +#define glVertexArrayVertexBindingDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexBindingDivisorEXT) +#define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding) +#define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat) +#define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat) +#define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat) +#define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor) + +#define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding) + +#endif /* GL_ARB_vertex_attrib_binding */ + +/* -------------------------- 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, void *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 void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *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, void** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void * (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, void** 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_10f_11f_11f_rev ------------------ */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 + +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B + +#define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) + +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + +/* ------------------- 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_ARM_mali_program_binary ---------------------- */ + +#ifndef GL_ARM_mali_program_binary +#define GL_ARM_mali_program_binary 1 + +#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 + +#define GLEW_ARM_mali_program_binary GLEW_GET_VAR(__GLEW_ARM_mali_program_binary) + +#endif /* GL_ARM_mali_program_binary */ + +/* ----------------------- GL_ARM_mali_shader_binary ----------------------- */ + +#ifndef GL_ARM_mali_shader_binary +#define GL_ARM_mali_shader_binary 1 + +#define GL_MALI_SHADER_BINARY_ARM 0x8F60 + +#define GLEW_ARM_mali_shader_binary GLEW_GET_VAR(__GLEW_ARM_mali_shader_binary) + +#endif /* GL_ARM_mali_shader_binary */ + +/* ------------------------------ GL_ARM_rgba8 ----------------------------- */ + +#ifndef GL_ARM_rgba8 +#define GL_ARM_rgba8 1 + +#define GL_RGBA8_OES 0x8058 + +#define GLEW_ARM_rgba8 GLEW_GET_VAR(__GLEW_ARM_rgba8) + +#endif /* GL_ARM_rgba8 */ + +/* -------------------- GL_ARM_shader_framebuffer_fetch -------------------- */ + +#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 + +#define GLEW_ARM_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch) + +#endif /* GL_ARM_shader_framebuffer_fetch */ + +/* ------------- GL_ARM_shader_framebuffer_fetch_depth_stencil ------------- */ + +#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil +#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 + +#define GLEW_ARM_shader_framebuffer_fetch_depth_stencil GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch_depth_stencil) + +#endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */ + +/* ------------------------- 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_2X_BIT_ATI 0x00000001 +#define GL_RED_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_BLUE_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 *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); + +#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 glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI) +#define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI) +#define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI) +#define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI) +#define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI) +#define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI) +#define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI) +#define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI) +#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_EGL_KHR_context_flush_control ------------------- */ + +#ifndef GL_EGL_KHR_context_flush_control +#define GL_EGL_KHR_context_flush_control 1 + +#define GLEW_EGL_KHR_context_flush_control GLEW_GET_VAR(__GLEW_EGL_KHR_context_flush_control) + +#endif /* GL_EGL_KHR_context_flush_control */ + +/* ---------------- GL_EGL_NV_robustness_video_memory_purge ---------------- */ + +#ifndef GL_EGL_NV_robustness_video_memory_purge +#define GL_EGL_NV_robustness_video_memory_purge 1 + +#define GL_EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C +#define GL_PURGED_CONTEXT_RESET_NV 0x92BB + +#define GLEW_EGL_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_EGL_NV_robustness_video_memory_purge) + +#endif /* GL_EGL_NV_robustness_video_memory_purge */ + +/* --------------------------- 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_EGL_image_array ------------------------ */ + +#ifndef GL_EXT_EGL_image_array +#define GL_EXT_EGL_image_array 1 + +#define GLEW_EXT_EGL_image_array GLEW_GET_VAR(__GLEW_EXT_EGL_image_array) + +#endif /* GL_EXT_EGL_image_array */ + +/* --------------------------- GL_EXT_YUV_target --------------------------- */ + +#ifndef GL_EXT_YUV_target +#define GL_EXT_YUV_target 1 + +#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 + +#define GLEW_EXT_YUV_target GLEW_GET_VAR(__GLEW_EXT_YUV_target) + +#endif /* GL_EXT_YUV_target */ + +/* ------------------------------ 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_base_instance ------------------------- */ + +#ifndef GL_EXT_base_instance +#define GL_EXT_base_instance 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); + +#define glDrawArraysInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstanceEXT) +#define glDrawElementsInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstanceEXT) +#define glDrawElementsInstancedBaseVertexBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstanceEXT) + +#define GLEW_EXT_base_instance GLEW_GET_VAR(__GLEW_EXT_base_instance) + +#endif /* GL_EXT_base_instance */ + +/* ------------------------------ 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_extended ---------------------- */ + +#ifndef GL_EXT_blend_func_extended +#define GL_EXT_blend_func_extended 1 + +#define GL_SRC_ALPHA_SATURATE_EXT 0x0308 +#define GL_SRC1_ALPHA_EXT 0x8589 +#define GL_SRC1_COLOR_EXT 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC +#define GL_LOCATION_INDEX_EXT 0x930F + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar * name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar* name); + +#define glBindFragDataLocationIndexedEXT GLEW_GET_FUN(__glewBindFragDataLocationIndexedEXT) +#define glGetFragDataIndexEXT GLEW_GET_FUN(__glewGetFragDataIndexEXT) +#define glGetProgramResourceLocationIndexEXT GLEW_GET_FUN(__glewGetProgramResourceLocationIndexEXT) + +#define GLEW_EXT_blend_func_extended GLEW_GET_VAR(__GLEW_EXT_blend_func_extended) + +#endif /* GL_EXT_blend_func_extended */ + +/* ----------------------- 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_buffer_storage ------------------------- */ + +#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 (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); + +#define glBufferStorageEXT GLEW_GET_FUN(__glewBufferStorageEXT) +#define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) + +#define GLEW_EXT_buffer_storage GLEW_GET_VAR(__GLEW_EXT_buffer_storage) + +#endif /* GL_EXT_buffer_storage */ + +/* -------------------------- GL_EXT_clear_texture ------------------------- */ + +#ifndef GL_EXT_clear_texture +#define GL_EXT_clear_texture 1 + +typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); + +#define glClearTexImageEXT GLEW_GET_FUN(__glewClearTexImageEXT) +#define glClearTexSubImageEXT GLEW_GET_FUN(__glewClearTexSubImageEXT) + +#define GLEW_EXT_clear_texture GLEW_GET_VAR(__GLEW_EXT_clear_texture) + +#endif /* GL_EXT_clear_texture */ + +/* ----------------------- GL_EXT_clip_cull_distance ----------------------- */ + +#ifndef GL_EXT_clip_cull_distance +#define GL_EXT_clip_cull_distance 1 + +#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 +#define GL_CLIP_DISTANCE0_EXT 0x3000 +#define GL_CLIP_DISTANCE1_EXT 0x3001 +#define GL_CLIP_DISTANCE2_EXT 0x3002 +#define GL_CLIP_DISTANCE3_EXT 0x3003 +#define GL_CLIP_DISTANCE4_EXT 0x3004 +#define GL_CLIP_DISTANCE5_EXT 0x3005 +#define GL_CLIP_DISTANCE6_EXT 0x3006 +#define GL_CLIP_DISTANCE7_EXT 0x3007 +#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA + +#define GLEW_EXT_clip_cull_distance GLEW_GET_VAR(__GLEW_EXT_clip_cull_distance) + +#endif /* GL_EXT_clip_cull_distance */ + +/* ------------------------ 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_buffer_float ----------------------- */ + +#ifndef GL_EXT_color_buffer_float +#define GL_EXT_color_buffer_float 1 + +#define GLEW_EXT_color_buffer_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_float) + +#endif /* GL_EXT_color_buffer_float */ + +/* --------------------- GL_EXT_color_buffer_half_float -------------------- */ + +#ifndef GL_EXT_color_buffer_half_float +#define GL_EXT_color_buffer_half_float 1 + +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 +#define GL_R16F_EXT 0x822D +#define GL_RG16F_EXT 0x822F +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 + +#define GLEW_EXT_color_buffer_half_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_half_float) + +#endif /* GL_EXT_color_buffer_half_float */ + +/* ------------------------- 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_compressed_ETC1_RGB8_sub_texture ---------------- */ + +#ifndef GL_EXT_compressed_ETC1_RGB8_sub_texture +#define GL_EXT_compressed_ETC1_RGB8_sub_texture 1 + +#define GLEW_EXT_compressed_ETC1_RGB8_sub_texture GLEW_GET_VAR(__GLEW_EXT_compressed_ETC1_RGB8_sub_texture) + +#endif /* GL_EXT_compressed_ETC1_RGB8_sub_texture */ + +/* ----------------------- GL_EXT_conservative_depth ----------------------- */ + +#ifndef GL_EXT_conservative_depth +#define GL_EXT_conservative_depth 1 + +#define GLEW_EXT_conservative_depth GLEW_GET_VAR(__GLEW_EXT_conservative_depth) + +#endif /* GL_EXT_conservative_depth */ + +/* --------------------------- 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_image --------------------------- */ + +#ifndef GL_EXT_copy_image +#define GL_EXT_copy_image 1 + +typedef void (GLAPIENTRY * 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); + +#define glCopyImageSubDataEXT GLEW_GET_FUN(__glewCopyImageSubDataEXT) + +#define GLEW_EXT_copy_image GLEW_GET_VAR(__GLEW_EXT_copy_image) + +#endif /* GL_EXT_copy_image */ + +/* -------------------------- 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_debug_label -------------------------- */ + +#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 (GLAPIENTRY * PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar* label); + +#define glGetObjectLabelEXT GLEW_GET_FUN(__glewGetObjectLabelEXT) +#define glLabelObjectEXT GLEW_GET_FUN(__glewLabelObjectEXT) + +#define GLEW_EXT_debug_label GLEW_GET_VAR(__GLEW_EXT_debug_label) + +#endif /* GL_EXT_debug_label */ + +/* -------------------------- GL_EXT_debug_marker -------------------------- */ + +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 + +typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker); +typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker); + +#define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT) +#define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT) +#define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT) + +#define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker) + +#endif /* GL_EXT_debug_marker */ + +/* ------------------------ 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, void** params); +typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void** 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, void** param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void** param); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef void * (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 * PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +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 glVertexArrayVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribDivisorEXT) +#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_discard_framebuffer ---------------------- */ + +#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 (GLAPIENTRY * PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); + +#define glDiscardFramebufferEXT GLEW_GET_FUN(__glewDiscardFramebufferEXT) + +#define GLEW_EXT_discard_framebuffer GLEW_GET_VAR(__GLEW_EXT_discard_framebuffer) + +#endif /* GL_EXT_discard_framebuffer */ + +/* -------------------------- GL_EXT_draw_buffers -------------------------- */ + +#ifndef GL_EXT_draw_buffers +#define GL_EXT_draw_buffers 1 + +#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_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 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersEXT GLEW_GET_FUN(__glewDrawBuffersEXT) + +#define GLEW_EXT_draw_buffers GLEW_GET_VAR(__GLEW_EXT_draw_buffers) + +#endif /* GL_EXT_draw_buffers */ + +/* -------------------------- 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_buffers_indexed ---------------------- */ + +#ifndef GL_EXT_draw_buffers_indexed +#define GL_EXT_draw_buffers_indexed 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLCOLORMASKIEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRY * PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEIEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index); + +#define glBlendEquationSeparateiEXT GLEW_GET_FUN(__glewBlendEquationSeparateiEXT) +#define glBlendEquationiEXT GLEW_GET_FUN(__glewBlendEquationiEXT) +#define glBlendFuncSeparateiEXT GLEW_GET_FUN(__glewBlendFuncSeparateiEXT) +#define glBlendFunciEXT GLEW_GET_FUN(__glewBlendFunciEXT) +#define glColorMaskiEXT GLEW_GET_FUN(__glewColorMaskiEXT) +#define glDisableiEXT GLEW_GET_FUN(__glewDisableiEXT) +#define glEnableiEXT GLEW_GET_FUN(__glewEnableiEXT) +#define glIsEnablediEXT GLEW_GET_FUN(__glewIsEnablediEXT) + +#define GLEW_EXT_draw_buffers_indexed GLEW_GET_VAR(__GLEW_EXT_draw_buffers_indexed) + +#endif /* GL_EXT_draw_buffers_indexed */ + +/* -------------------- GL_EXT_draw_elements_base_vertex ------------------- */ + +#ifndef GL_EXT_draw_elements_base_vertex +#define GL_EXT_draw_elements_base_vertex 1 + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); + +#define glDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsBaseVertexEXT) +#define glDrawElementsInstancedBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexEXT) +#define glDrawRangeElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawRangeElementsBaseVertexEXT) +#define glMultiDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewMultiDrawElementsBaseVertexEXT) + +#define GLEW_EXT_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_EXT_draw_elements_base_vertex) + +#endif /* GL_EXT_draw_elements_base_vertex */ + +/* ------------------------- 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 void *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 void *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_external_buffer ------------------------ */ + +#ifndef GL_EXT_external_buffer +#define GL_EXT_external_buffer 1 + +typedef void* GLeglClientBufferEXT; + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); + +#define glBufferStorageExternalEXT GLEW_GET_FUN(__glewBufferStorageExternalEXT) +#define glNamedBufferStorageExternalEXT GLEW_GET_FUN(__glewNamedBufferStorageExternalEXT) + +#define GLEW_EXT_external_buffer GLEW_GET_VAR(__GLEW_EXT_external_buffer) + +#endif /* GL_EXT_external_buffer */ + +/* --------------------------- GL_EXT_float_blend -------------------------- */ + +#ifndef GL_EXT_float_blend +#define GL_EXT_float_blend 1 + +#define GLEW_EXT_float_blend GLEW_GET_VAR(__GLEW_EXT_float_blend) + +#endif /* GL_EXT_float_blend */ + +/* ---------------------------- 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 void *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_frag_depth --------------------------- */ + +#ifndef GL_EXT_frag_depth +#define GL_EXT_frag_depth 1 + +#define GLEW_EXT_frag_depth GLEW_GET_VAR(__GLEW_EXT_frag_depth) + +#endif /* GL_EXT_frag_depth */ + +/* ------------------------ 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_point_size ---------------------- */ + +#ifndef GL_EXT_geometry_point_size +#define GL_EXT_geometry_point_size 1 + +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#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_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#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_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#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_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 + +#define GLEW_EXT_geometry_point_size GLEW_GET_VAR(__GLEW_EXT_geometry_point_size) + +#endif /* GL_EXT_geometry_point_size */ + +/* ------------------------- GL_EXT_geometry_shader ------------------------ */ + +#ifndef GL_EXT_geometry_shader +#define GL_EXT_geometry_shader 1 + +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#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_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#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_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#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_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 + +#define GLEW_EXT_geometry_shader GLEW_GET_VAR(__GLEW_EXT_geometry_shader) + +#endif /* GL_EXT_geometry_shader */ + +/* ------------------------ 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 void *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_gpu_shader5 -------------------------- */ + +#ifndef GL_EXT_gpu_shader5 +#define GL_EXT_gpu_shader5 1 + +#define GLEW_EXT_gpu_shader5 GLEW_GET_VAR(__GLEW_EXT_gpu_shader5) + +#endif /* GL_EXT_gpu_shader5 */ + +/* ---------------------------- 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_instanced_arrays ------------------------ */ + +#ifndef GL_EXT_instanced_arrays +#define GL_EXT_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexAttribDivisorEXT) + +#define GLEW_EXT_instanced_arrays GLEW_GET_VAR(__GLEW_EXT_instanced_arrays) + +#endif /* GL_EXT_instanced_arrays */ + +/* -------------------------- 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 + +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_map_buffer_range ------------------------ */ + +#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 (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + +#define glFlushMappedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedBufferRangeEXT) +#define glMapBufferRangeEXT GLEW_GET_FUN(__glewMapBufferRangeEXT) + +#define GLEW_EXT_map_buffer_range GLEW_GET_VAR(__GLEW_EXT_map_buffer_range) + +#endif /* GL_EXT_map_buffer_range */ + +/* -------------------------- GL_EXT_memory_object ------------------------- */ + +#ifndef GL_EXT_memory_object +#define GL_EXT_memory_object 1 + +#define GL_UUID_SIZE_EXT 16 +#define GL_TEXTURE_TILING_EXT 0x9580 +#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 +#define GL_NUM_TILING_TYPES_EXT 0x9582 +#define GL_TILING_TYPES_EXT 0x9583 +#define GL_OPTIMAL_TILING_EXT 0x9584 +#define GL_LINEAR_TILING_EXT 0x9585 +#define GL_LAYOUT_GENERAL_EXT 0x958D +#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E +#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F +#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 +#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 +#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 +#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 +#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 +#define GL_DEVICE_UUID_EXT 0x9597 +#define GL_DRIVER_UUID_EXT 0x9598 +#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint* memoryObjects); +typedef void (GLAPIENTRY * PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint* memoryObjects); +typedef void (GLAPIENTRY * PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte* data); +typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte* data); +typedef GLboolean (GLAPIENTRY * PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); +typedef void (GLAPIENTRY * PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM1DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); + +#define glBufferStorageMemEXT GLEW_GET_FUN(__glewBufferStorageMemEXT) +#define glCreateMemoryObjectsEXT GLEW_GET_FUN(__glewCreateMemoryObjectsEXT) +#define glDeleteMemoryObjectsEXT GLEW_GET_FUN(__glewDeleteMemoryObjectsEXT) +#define glGetMemoryObjectParameterivEXT GLEW_GET_FUN(__glewGetMemoryObjectParameterivEXT) +#define glGetUnsignedBytei_vEXT GLEW_GET_FUN(__glewGetUnsignedBytei_vEXT) +#define glGetUnsignedBytevEXT GLEW_GET_FUN(__glewGetUnsignedBytevEXT) +#define glIsMemoryObjectEXT GLEW_GET_FUN(__glewIsMemoryObjectEXT) +#define glMemoryObjectParameterivEXT GLEW_GET_FUN(__glewMemoryObjectParameterivEXT) +#define glNamedBufferStorageMemEXT GLEW_GET_FUN(__glewNamedBufferStorageMemEXT) +#define glTexStorageMem1DEXT GLEW_GET_FUN(__glewTexStorageMem1DEXT) +#define glTexStorageMem2DEXT GLEW_GET_FUN(__glewTexStorageMem2DEXT) +#define glTexStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem2DMultisampleEXT) +#define glTexStorageMem3DEXT GLEW_GET_FUN(__glewTexStorageMem3DEXT) +#define glTexStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem3DMultisampleEXT) +#define glTextureStorageMem1DEXT GLEW_GET_FUN(__glewTextureStorageMem1DEXT) +#define glTextureStorageMem2DEXT GLEW_GET_FUN(__glewTextureStorageMem2DEXT) +#define glTextureStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem2DMultisampleEXT) +#define glTextureStorageMem3DEXT GLEW_GET_FUN(__glewTextureStorageMem3DEXT) +#define glTextureStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem3DMultisampleEXT) + +#define GLEW_EXT_memory_object GLEW_GET_VAR(__GLEW_EXT_memory_object) + +#endif /* GL_EXT_memory_object */ + +/* ------------------------ GL_EXT_memory_object_fd ------------------------ */ + +#ifndef GL_EXT_memory_object_fd +#define GL_EXT_memory_object_fd 1 + +#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 + +typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); + +#define glImportMemoryFdEXT GLEW_GET_FUN(__glewImportMemoryFdEXT) + +#define GLEW_EXT_memory_object_fd GLEW_GET_VAR(__GLEW_EXT_memory_object_fd) + +#endif /* GL_EXT_memory_object_fd */ + +/* ----------------------- GL_EXT_memory_object_win32 ---------------------- */ + +#ifndef GL_EXT_memory_object_win32 +#define GL_EXT_memory_object_win32 1 + +#define GL_LUID_SIZE_EXT 8 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 +#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 +#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A +#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B +#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C +#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 +#define GL_D3D12_FENCE_VALUE_EXT 0x9595 +#define GL_DEVICE_LUID_EXT 0x9599 +#define GL_DEVICE_NODE_MASK_EXT 0x959A + +typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); + +#define glImportMemoryWin32HandleEXT GLEW_GET_FUN(__glewImportMemoryWin32HandleEXT) +#define glImportMemoryWin32NameEXT GLEW_GET_FUN(__glewImportMemoryWin32NameEXT) + +#define GLEW_EXT_memory_object_win32 GLEW_GET_VAR(__GLEW_EXT_memory_object_win32) + +#endif /* GL_EXT_memory_object_win32 */ + +/* ------------------------- 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 void *const *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_multi_draw_indirect ---------------------- */ + +#ifndef GL_EXT_multi_draw_indirect +#define GL_EXT_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); + +#define glMultiDrawArraysIndirectEXT GLEW_GET_FUN(__glewMultiDrawArraysIndirectEXT) +#define glMultiDrawElementsIndirectEXT GLEW_GET_FUN(__glewMultiDrawElementsIndirectEXT) + +#define GLEW_EXT_multi_draw_indirect GLEW_GET_VAR(__GLEW_EXT_multi_draw_indirect) + +#endif /* GL_EXT_multi_draw_indirect */ + +/* ------------------------ GL_EXT_multiple_textures ----------------------- */ + +#ifndef GL_EXT_multiple_textures +#define GL_EXT_multiple_textures 1 + +#define GLEW_EXT_multiple_textures GLEW_GET_VAR(__GLEW_EXT_multiple_textures) + +#endif /* GL_EXT_multiple_textures */ + +/* --------------------------- 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_multisample_compatibility ------------------- */ + +#ifndef GL_EXT_multisample_compatibility +#define GL_EXT_multisample_compatibility 1 + +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F + +#define GLEW_EXT_multisample_compatibility GLEW_GET_VAR(__GLEW_EXT_multisample_compatibility) + +#endif /* GL_EXT_multisample_compatibility */ + +/* ----------------- GL_EXT_multisampled_render_to_texture ----------------- */ + +#ifndef GL_EXT_multisampled_render_to_texture +#define GL_EXT_multisampled_render_to_texture 1 + +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); + +#define glFramebufferTexture2DMultisampleEXT GLEW_GET_FUN(__glewFramebufferTexture2DMultisampleEXT) + +#define GLEW_EXT_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture) + +#endif /* GL_EXT_multisampled_render_to_texture */ + +/* ----------------- GL_EXT_multisampled_render_to_texture2 ---------------- */ + +#ifndef GL_EXT_multisampled_render_to_texture2 +#define GL_EXT_multisampled_render_to_texture2 1 + +#define GLEW_EXT_multisampled_render_to_texture2 GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture2) + +#endif /* GL_EXT_multisampled_render_to_texture2 */ + +/* --------------------- GL_EXT_multiview_draw_buffers --------------------- */ + +#ifndef GL_EXT_multiview_draw_buffers +#define GL_EXT_multiview_draw_buffers 1 + +#define GL_DRAW_BUFFER_EXT 0x0C01 +#define GL_READ_BUFFER_EXT 0x0C02 +#define GL_COLOR_ATTACHMENT_EXT 0x90F0 +#define GL_MULTIVIEW_EXT 0x90F1 +#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum* location, const GLint *indices); +typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint* data); +typedef void (GLAPIENTRY * PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); + +#define glDrawBuffersIndexedEXT GLEW_GET_FUN(__glewDrawBuffersIndexedEXT) +#define glGetIntegeri_vEXT GLEW_GET_FUN(__glewGetIntegeri_vEXT) +#define glReadBufferIndexedEXT GLEW_GET_FUN(__glewReadBufferIndexedEXT) + +#define GLEW_EXT_multiview_draw_buffers GLEW_GET_VAR(__GLEW_EXT_multiview_draw_buffers) + +#endif /* GL_EXT_multiview_draw_buffers */ + +/* ---------------------- 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_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_polygon_offset_clamp ---------------------- */ + +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 + +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); + +#define glPolygonOffsetClampEXT GLEW_GET_FUN(__glewPolygonOffsetClampEXT) + +#define GLEW_EXT_polygon_offset_clamp GLEW_GET_VAR(__GLEW_EXT_polygon_offset_clamp) + +#endif /* GL_EXT_polygon_offset_clamp */ + +/* ----------------------- GL_EXT_post_depth_coverage ---------------------- */ + +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 + +#define GLEW_EXT_post_depth_coverage GLEW_GET_VAR(__GLEW_EXT_post_depth_coverage) + +#endif /* GL_EXT_post_depth_coverage */ + +/* ------------------------ 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_pvrtc_sRGB --------------------------- */ + +#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 GLEW_EXT_pvrtc_sRGB GLEW_GET_VAR(__GLEW_EXT_pvrtc_sRGB) + +#endif /* GL_EXT_pvrtc_sRGB */ + +/* ----------------------- GL_EXT_raster_multisample ----------------------- */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 +#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 +#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_TABLE_NV 0x9331 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 + +typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat* v); +typedef void (GLAPIENTRY * PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); + +#define glCoverageModulationNV GLEW_GET_FUN(__glewCoverageModulationNV) +#define glCoverageModulationTableNV GLEW_GET_FUN(__glewCoverageModulationTableNV) +#define glGetCoverageModulationTableNV GLEW_GET_FUN(__glewGetCoverageModulationTableNV) +#define glRasterSamplesEXT GLEW_GET_FUN(__glewRasterSamplesEXT) + +#define GLEW_EXT_raster_multisample GLEW_GET_VAR(__GLEW_EXT_raster_multisample) + +#endif /* GL_EXT_raster_multisample */ + +/* ------------------------ GL_EXT_read_format_bgra ------------------------ */ + +#ifndef GL_EXT_read_format_bgra +#define GL_EXT_read_format_bgra 1 + +#define GL_BGRA_EXT 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 + +#define GLEW_EXT_read_format_bgra GLEW_GET_VAR(__GLEW_EXT_read_format_bgra) + +#endif /* GL_EXT_read_format_bgra */ + +/* -------------------------- GL_EXT_render_snorm -------------------------- */ + +#ifndef GL_EXT_render_snorm +#define GL_EXT_render_snorm 1 + +#define GL_BYTE 0x1400 +#define GL_SHORT 0x1402 +#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 + +#define GLEW_EXT_render_snorm GLEW_GET_VAR(__GLEW_EXT_render_snorm) + +#endif /* GL_EXT_render_snorm */ + +/* ------------------------- 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_sRGB ------------------------------ */ + +#ifndef GL_EXT_sRGB +#define GL_EXT_sRGB 1 + +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 + +#define GLEW_EXT_sRGB GLEW_GET_VAR(__GLEW_EXT_sRGB) + +#endif /* GL_EXT_sRGB */ + +/* ----------------------- GL_EXT_sRGB_write_control ----------------------- */ + +#ifndef GL_EXT_sRGB_write_control +#define GL_EXT_sRGB_write_control 1 + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 + +#define GLEW_EXT_sRGB_write_control GLEW_GET_VAR(__GLEW_EXT_sRGB_write_control) + +#endif /* GL_EXT_sRGB_write_control */ + +/* -------------------------- 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 void *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_semaphore --------------------------- */ + +#ifndef GL_EXT_semaphore +#define GL_EXT_semaphore 1 + +typedef void (GLAPIENTRY * PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint* semaphores); +typedef void (GLAPIENTRY * PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint* semaphores); +typedef void (GLAPIENTRY * PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64* params); +typedef GLboolean (GLAPIENTRY * PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); +typedef void (GLAPIENTRY * PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64* params); +typedef void (GLAPIENTRY * PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +typedef void (GLAPIENTRY * PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); + +#define glDeleteSemaphoresEXT GLEW_GET_FUN(__glewDeleteSemaphoresEXT) +#define glGenSemaphoresEXT GLEW_GET_FUN(__glewGenSemaphoresEXT) +#define glGetSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewGetSemaphoreParameterui64vEXT) +#define glIsSemaphoreEXT GLEW_GET_FUN(__glewIsSemaphoreEXT) +#define glSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewSemaphoreParameterui64vEXT) +#define glSignalSemaphoreEXT GLEW_GET_FUN(__glewSignalSemaphoreEXT) +#define glWaitSemaphoreEXT GLEW_GET_FUN(__glewWaitSemaphoreEXT) + +#define GLEW_EXT_semaphore GLEW_GET_VAR(__GLEW_EXT_semaphore) + +#endif /* GL_EXT_semaphore */ + +/* -------------------------- GL_EXT_semaphore_fd -------------------------- */ + +#ifndef GL_EXT_semaphore_fd +#define GL_EXT_semaphore_fd 1 + +typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); + +#define glImportSemaphoreFdEXT GLEW_GET_FUN(__glewImportSemaphoreFdEXT) + +#define GLEW_EXT_semaphore_fd GLEW_GET_VAR(__GLEW_EXT_semaphore_fd) + +#endif /* GL_EXT_semaphore_fd */ + +/* ------------------------- GL_EXT_semaphore_win32 ------------------------ */ + +#ifndef GL_EXT_semaphore_win32 +#define GL_EXT_semaphore_win32 1 + +typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); +typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); + +#define glImportSemaphoreWin32HandleEXT GLEW_GET_FUN(__glewImportSemaphoreWin32HandleEXT) +#define glImportSemaphoreWin32NameEXT GLEW_GET_FUN(__glewImportSemaphoreWin32NameEXT) + +#define GLEW_EXT_semaphore_win32 GLEW_GET_VAR(__GLEW_EXT_semaphore_win32) + +#endif /* GL_EXT_semaphore_win32 */ + +/* --------------------- 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 GLchar* 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_framebuffer_fetch -------------------- */ + +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_EXT_shader_framebuffer_fetch 1 + +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 + +#define GLEW_EXT_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_EXT_shader_framebuffer_fetch) + +#endif /* GL_EXT_shader_framebuffer_fetch */ + +/* ------------------------ GL_EXT_shader_group_vote ----------------------- */ + +#ifndef GL_EXT_shader_group_vote +#define GL_EXT_shader_group_vote 1 + +#define GLEW_EXT_shader_group_vote GLEW_GET_VAR(__GLEW_EXT_shader_group_vote) + +#endif /* GL_EXT_shader_group_vote */ + +/* ------------------- GL_EXT_shader_image_load_formatted ------------------ */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 + +#define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted) + +#endif /* GL_EXT_shader_image_load_formatted */ + +/* --------------------- 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_shader_implicit_conversions ------------------ */ + +#ifndef GL_EXT_shader_implicit_conversions +#define GL_EXT_shader_implicit_conversions 1 + +#define GLEW_EXT_shader_implicit_conversions GLEW_GET_VAR(__GLEW_EXT_shader_implicit_conversions) + +#endif /* GL_EXT_shader_implicit_conversions */ + +/* ----------------------- GL_EXT_shader_integer_mix ----------------------- */ + +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 + +#define GLEW_EXT_shader_integer_mix GLEW_GET_VAR(__GLEW_EXT_shader_integer_mix) + +#endif /* GL_EXT_shader_integer_mix */ + +/* ------------------------ GL_EXT_shader_io_blocks ------------------------ */ + +#ifndef GL_EXT_shader_io_blocks +#define GL_EXT_shader_io_blocks 1 + +#define GLEW_EXT_shader_io_blocks GLEW_GET_VAR(__GLEW_EXT_shader_io_blocks) + +#endif /* GL_EXT_shader_io_blocks */ + +/* ------------- GL_EXT_shader_non_constant_global_initializers ------------ */ + +#ifndef GL_EXT_shader_non_constant_global_initializers +#define GL_EXT_shader_non_constant_global_initializers 1 + +#define GLEW_EXT_shader_non_constant_global_initializers GLEW_GET_VAR(__GLEW_EXT_shader_non_constant_global_initializers) + +#endif /* GL_EXT_shader_non_constant_global_initializers */ + +/* ------------------- GL_EXT_shader_pixel_local_storage ------------------- */ + +#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_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 + +#define GLEW_EXT_shader_pixel_local_storage GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage) + +#endif /* GL_EXT_shader_pixel_local_storage */ + +/* ------------------- GL_EXT_shader_pixel_local_storage2 ------------------ */ + +#ifndef GL_EXT_shader_pixel_local_storage2 +#define GL_EXT_shader_pixel_local_storage2 1 + +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT 0x9650 +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT 0x9651 +#define GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT 0x9652 + +typedef void (GLAPIENTRY * PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint* values); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); +typedef GLsizei (GLAPIENTRY * PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); + +#define glClearPixelLocalStorageuiEXT GLEW_GET_FUN(__glewClearPixelLocalStorageuiEXT) +#define glFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewFramebufferPixelLocalStorageSizeEXT) +#define glGetFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewGetFramebufferPixelLocalStorageSizeEXT) + +#define GLEW_EXT_shader_pixel_local_storage2 GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage2) + +#endif /* GL_EXT_shader_pixel_local_storage2 */ + +/* ----------------------- GL_EXT_shader_texture_lod ----------------------- */ + +#ifndef GL_EXT_shader_texture_lod +#define GL_EXT_shader_texture_lod 1 + +#define GLEW_EXT_shader_texture_lod GLEW_GET_VAR(__GLEW_EXT_shader_texture_lod) + +#endif /* GL_EXT_shader_texture_lod */ + +/* -------------------------- 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_shadow_samplers ------------------------ */ + +#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 + +#define GLEW_EXT_shadow_samplers GLEW_GET_VAR(__GLEW_EXT_shadow_samplers) + +#endif /* GL_EXT_shadow_samplers */ + +/* --------------------- 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_sparse_texture ------------------------- */ + +#ifndef GL_EXT_sparse_texture +#define GL_EXT_sparse_texture 1 + +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_3D 0x806F +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 +#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_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_TEXTURE_SPARSE_EXT 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7 +#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8 +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9 +#define GL_NUM_SPARSE_LEVELS_EXT 0x91AA + +typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + +#define glTexPageCommitmentEXT GLEW_GET_FUN(__glewTexPageCommitmentEXT) +#define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) + +#define GLEW_EXT_sparse_texture GLEW_GET_VAR(__GLEW_EXT_sparse_texture) + +#endif /* GL_EXT_sparse_texture */ + +/* ------------------------- GL_EXT_sparse_texture2 ------------------------ */ + +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 + +#define GLEW_EXT_sparse_texture2 GLEW_GET_VAR(__GLEW_EXT_sparse_texture2) + +#endif /* GL_EXT_sparse_texture2 */ + +/* ------------------------ 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_astc_decode_mode -------------- */ + +#ifndef GL_EXT_texture_compression_astc_decode_mode +#define GL_EXT_texture_compression_astc_decode_mode 1 + +#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 + +#define GLEW_EXT_texture_compression_astc_decode_mode GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode) + +#endif /* GL_EXT_texture_compression_astc_decode_mode */ + +/* ----------- GL_EXT_texture_compression_astc_decode_mode_rgb9e5 ---------- */ + +#ifndef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 +#define GL_EXT_texture_compression_astc_decode_mode_rgb9e5 1 + +#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 + +#define GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5 GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5) + +#endif /* GL_EXT_texture_compression_astc_decode_mode_rgb9e5 */ + +/* -------------------- GL_EXT_texture_compression_bptc -------------------- */ + +#ifndef GL_EXT_texture_compression_bptc +#define GL_EXT_texture_compression_bptc 1 + +#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F + +#define GLEW_EXT_texture_compression_bptc GLEW_GET_VAR(__GLEW_EXT_texture_compression_bptc) + +#endif /* GL_EXT_texture_compression_bptc */ + +/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 + +#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_cube_map_array --------------------- */ + +#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 + +#define GLEW_EXT_texture_cube_map_array GLEW_GET_VAR(__GLEW_EXT_texture_cube_map_array) + +#endif /* GL_EXT_texture_cube_map_array */ + +/* ----------------------- 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 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_filter_minmax --------------------- */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 + +#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 +#define GL_WEIGHTED_AVERAGE_EXT 0x9367 + +#define GLEW_EXT_texture_filter_minmax GLEW_GET_VAR(__GLEW_EXT_texture_filter_minmax) + +#endif /* GL_EXT_texture_filter_minmax */ + +/* --------------------- GL_EXT_texture_format_BGRA8888 -------------------- */ + +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_EXT_texture_format_BGRA8888 1 + +#define GL_BGRA_EXT 0x80E1 + +#define GLEW_EXT_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_EXT_texture_format_BGRA8888) + +#endif /* GL_EXT_texture_format_BGRA8888 */ + +/* ------------------------- 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_norm16 ------------------------- */ + +#ifndef GL_EXT_texture_norm16 +#define GL_EXT_texture_norm16 1 + +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA16_EXT 0x805B +#define GL_R16_EXT 0x822A +#define GL_RG16_EXT 0x822C +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGB16_SNORM_EXT 0x8F9A +#define GL_RGBA16_SNORM_EXT 0x8F9B + +#define GLEW_EXT_texture_norm16 GLEW_GET_VAR(__GLEW_EXT_texture_norm16) + +#endif /* GL_EXT_texture_norm16 */ + +/* ------------------------- 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_rg --------------------------- */ + +#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 + +#define GLEW_EXT_texture_rg GLEW_GET_VAR(__GLEW_EXT_texture_rg) + +#endif /* GL_EXT_texture_rg */ + +/* -------------------------- 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_R8 ------------------------ */ + +#ifndef GL_EXT_texture_sRGB_R8 +#define GL_EXT_texture_sRGB_R8 1 + +#define GL_SR8_EXT 0x8FBD + +#define GLEW_EXT_texture_sRGB_R8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_R8) + +#endif /* GL_EXT_texture_sRGB_R8 */ + +/* ------------------------ GL_EXT_texture_sRGB_RG8 ------------------------ */ + +#ifndef GL_EXT_texture_sRGB_RG8 +#define GL_EXT_texture_sRGB_RG8 1 + +#define GL_SRG8_EXT 0x8FBE + +#define GLEW_EXT_texture_sRGB_RG8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_RG8) + +#endif /* GL_EXT_texture_sRGB_RG8 */ + +/* ----------------------- 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_storage ------------------------ */ + +#ifndef GL_EXT_texture_storage +#define GL_EXT_texture_storage 1 + +#define GL_ALPHA8_EXT 0x803C +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#define GL_R16F_EXT 0x822D +#define GL_R32F_EXT 0x822E +#define GL_RG16F_EXT 0x822F +#define GL_RG32F_EXT 0x8230 +#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_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_RGB_RAW_422_APPLE 0x8A51 +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_BGRA8_EXT 0x93A1 + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DEXTPROC) (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 glTexStorage1DEXT GLEW_GET_FUN(__glewTexStorage1DEXT) +#define glTexStorage2DEXT GLEW_GET_FUN(__glewTexStorage2DEXT) +#define glTexStorage3DEXT GLEW_GET_FUN(__glewTexStorage3DEXT) +#define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT) +#define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT) +#define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT) + +#define GLEW_EXT_texture_storage GLEW_GET_VAR(__GLEW_EXT_texture_storage) + +#endif /* GL_EXT_texture_storage */ + +/* ------------------------- 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_texture_type_2_10_10_10_REV ------------------ */ + +#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 + +#define GLEW_EXT_texture_type_2_10_10_10_REV GLEW_GET_VAR(__GLEW_EXT_texture_type_2_10_10_10_REV) + +#endif /* GL_EXT_texture_type_2_10_10_10_REV */ + +/* -------------------------- GL_EXT_texture_view -------------------------- */ + +#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 +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF + +typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); + +#define glTextureViewEXT GLEW_GET_FUN(__glewTextureViewEXT) + +#define GLEW_EXT_texture_view GLEW_GET_VAR(__GLEW_EXT_texture_view) + +#endif /* GL_EXT_texture_view */ + +/* --------------------------- 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, GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* 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_unpack_subimage ------------------------ */ + +#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 + +#define GLEW_EXT_unpack_subimage GLEW_GET_VAR(__GLEW_EXT_unpack_subimage) + +#endif /* GL_EXT_unpack_subimage */ + +/* -------------------------- 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_array_setXXX ---------------------- */ + +#ifndef GL_EXT_vertex_array_setXXX +#define GL_EXT_vertex_array_setXXX 1 + +typedef void (GLAPIENTRY * PFNGLBINDARRAYSETEXTPROC) (const void *arrayset); +typedef const void * (GLAPIENTRY * PFNGLCREATEARRAYSETEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLDELETEARRAYSETSEXTPROC) (GLsizei n, const void *arrayset[]); + +#define glBindArraySetEXT GLEW_GET_FUN(__glewBindArraySetEXT) +#define glCreateArraySetExt GLEW_GET_FUN(__glewCreateArraySetExt) +#define glDeleteArraySetsEXT GLEW_GET_FUN(__glewDeleteArraySetsEXT) + +#define GLEW_EXT_vertex_array_setXXX GLEW_GET_VAR(__GLEW_EXT_vertex_array_setXXX) + +#endif /* GL_EXT_vertex_array_setXXX */ + +/* ----------------------- 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, void **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, void *addr); +typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, void *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, void *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_win32_keyed_mutex ----------------------- */ + +#ifndef GL_EXT_win32_keyed_mutex +#define GL_EXT_win32_keyed_mutex 1 + +typedef GLboolean (GLAPIENTRY * PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); +typedef GLboolean (GLAPIENTRY * PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); + +#define glAcquireKeyedMutexWin32EXT GLEW_GET_FUN(__glewAcquireKeyedMutexWin32EXT) +#define glReleaseKeyedMutexWin32EXT GLEW_GET_FUN(__glewReleaseKeyedMutexWin32EXT) + +#define GLEW_EXT_win32_keyed_mutex GLEW_GET_VAR(__GLEW_EXT_win32_keyed_mutex) + +#endif /* GL_EXT_win32_keyed_mutex */ + +/* ------------------------ GL_EXT_window_rectangles ----------------------- */ + +#ifndef GL_EXT_window_rectangles +#define GL_EXT_window_rectangles 1 + +#define GL_INCLUSIVE_EXT 0x8F10 +#define GL_EXCLUSIVE_EXT 0x8F11 +#define GL_WINDOW_RECTANGLE_EXT 0x8F12 +#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 +#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 +#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 + +typedef void (GLAPIENTRY * PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint box[]); + +#define glWindowRectanglesEXT GLEW_GET_FUN(__glewWindowRectanglesEXT) + +#define GLEW_EXT_window_rectangles GLEW_GET_VAR(__GLEW_EXT_window_rectangles) + +#endif /* GL_EXT_window_rectangles */ + +/* ------------------------- 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 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 void *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 void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** 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_conservative_rasterization ------------------ */ + +#ifndef GL_INTEL_conservative_rasterization +#define GL_INTEL_conservative_rasterization 1 + +#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE + +#define GLEW_INTEL_conservative_rasterization GLEW_GET_VAR(__GLEW_INTEL_conservative_rasterization) + +#endif /* GL_INTEL_conservative_rasterization */ + +/* ------------------- GL_INTEL_fragment_shader_ordering ------------------- */ + +#ifndef GL_INTEL_fragment_shader_ordering +#define GL_INTEL_fragment_shader_ordering 1 + +#define GLEW_INTEL_fragment_shader_ordering GLEW_GET_VAR(__GLEW_INTEL_fragment_shader_ordering) + +#endif /* GL_INTEL_fragment_shader_ordering */ + +/* ----------------------- GL_INTEL_framebuffer_CMAA ----------------------- */ + +#ifndef GL_INTEL_framebuffer_CMAA +#define GL_INTEL_framebuffer_CMAA 1 + +#define GLEW_INTEL_framebuffer_CMAA GLEW_GET_VAR(__GLEW_INTEL_framebuffer_CMAA) + +#endif /* GL_INTEL_framebuffer_CMAA */ + +/* -------------------------- GL_INTEL_map_texture ------------------------- */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 + +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF + +typedef void * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); +typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); + +#define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) +#define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) +#define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) + +#define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) + +#endif /* GL_INTEL_map_texture */ + +/* ------------------------ 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_performance_query ---------------------- */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 + +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x0000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x0001 +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#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 (GLAPIENTRY * PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint* queryHandle); +typedef void (GLAPIENTRY * PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint* queryId); +typedef void (GLAPIENTRY * PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint* nextQueryId); +typedef void (GLAPIENTRY * PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar* queryName, GLuint *queryId); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); + +#define glBeginPerfQueryINTEL GLEW_GET_FUN(__glewBeginPerfQueryINTEL) +#define glCreatePerfQueryINTEL GLEW_GET_FUN(__glewCreatePerfQueryINTEL) +#define glDeletePerfQueryINTEL GLEW_GET_FUN(__glewDeletePerfQueryINTEL) +#define glEndPerfQueryINTEL GLEW_GET_FUN(__glewEndPerfQueryINTEL) +#define glGetFirstPerfQueryIdINTEL GLEW_GET_FUN(__glewGetFirstPerfQueryIdINTEL) +#define glGetNextPerfQueryIdINTEL GLEW_GET_FUN(__glewGetNextPerfQueryIdINTEL) +#define glGetPerfCounterInfoINTEL GLEW_GET_FUN(__glewGetPerfCounterInfoINTEL) +#define glGetPerfQueryDataINTEL GLEW_GET_FUN(__glewGetPerfQueryDataINTEL) +#define glGetPerfQueryIdByNameINTEL GLEW_GET_FUN(__glewGetPerfQueryIdByNameINTEL) +#define glGetPerfQueryInfoINTEL GLEW_GET_FUN(__glewGetPerfQueryInfoINTEL) + +#define GLEW_INTEL_performance_query GLEW_GET_VAR(__GLEW_INTEL_performance_query) + +#endif /* GL_INTEL_performance_query */ + +/* ------------------------ 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_KHR_blend_equation_advanced -------------------- */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 + +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#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 (GLAPIENTRY * PFNGLBLENDBARRIERKHRPROC) (void); + +#define glBlendBarrierKHR GLEW_GET_FUN(__glewBlendBarrierKHR) + +#define GLEW_KHR_blend_equation_advanced GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced) + +#endif /* GL_KHR_blend_equation_advanced */ + +/* ---------------- GL_KHR_blend_equation_advanced_coherent ---------------- */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 + +#define GLEW_KHR_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced_coherent) + +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +/* ---------------------- GL_KHR_context_flush_control --------------------- */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 + +#define GLEW_KHR_context_flush_control GLEW_GET_VAR(__GLEW_KHR_context_flush_control) + +#endif /* GL_KHR_context_flush_control */ + +/* ------------------------------ GL_KHR_debug ----------------------------- */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 + +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#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 +#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 + +typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (void* ptr, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); +typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (void* ptr, GLsizei length, const GLchar* label); +typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); + +#define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) +#define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl) +#define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert) +#define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) +#define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) +#define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) +#define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) +#define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) +#define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) +#define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) + +#define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) + +#endif /* GL_KHR_debug */ + +/* ---------------------------- GL_KHR_no_error ---------------------------- */ + +#ifndef GL_KHR_no_error +#define GL_KHR_no_error 1 + +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 + +#define GLEW_KHR_no_error GLEW_GET_VAR(__GLEW_KHR_no_error) + +#endif /* GL_KHR_no_error */ + +/* --------------------- GL_KHR_parallel_shader_compile -------------------- */ + +#ifndef GL_KHR_parallel_shader_compile +#define GL_KHR_parallel_shader_compile 1 + +#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 +#define GL_COMPLETION_STATUS_KHR 0x91B1 + +typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); + +#define glMaxShaderCompilerThreadsKHR GLEW_GET_FUN(__glewMaxShaderCompilerThreadsKHR) + +#define GLEW_KHR_parallel_shader_compile GLEW_GET_VAR(__GLEW_KHR_parallel_shader_compile) + +#endif /* GL_KHR_parallel_shader_compile */ + +/* ------------------ GL_KHR_robust_buffer_access_behavior ----------------- */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 + +#define GLEW_KHR_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_KHR_robust_buffer_access_behavior) + +#endif /* GL_KHR_robust_buffer_access_behavior */ + +/* --------------------------- GL_KHR_robustness --------------------------- */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 + +#define GL_CONTEXT_LOST 0x0507 +#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_ROBUST_ACCESS 0x90F3 + +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); +typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); + +#define glGetnUniformfv GLEW_GET_FUN(__glewGetnUniformfv) +#define glGetnUniformiv GLEW_GET_FUN(__glewGetnUniformiv) +#define glGetnUniformuiv GLEW_GET_FUN(__glewGetnUniformuiv) +#define glReadnPixels GLEW_GET_FUN(__glewReadnPixels) + +#define GLEW_KHR_robustness GLEW_GET_VAR(__GLEW_KHR_robustness) + +#endif /* GL_KHR_robustness */ + +/* ------------------ GL_KHR_texture_compression_astc_hdr ------------------ */ + +#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 + +#define GLEW_KHR_texture_compression_astc_hdr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_hdr) + +#endif /* GL_KHR_texture_compression_astc_hdr */ + +/* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 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 + +#define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr) + +#endif /* GL_KHR_texture_compression_astc_ldr */ + +/* --------------- GL_KHR_texture_compression_astc_sliced_3d --------------- */ + +#ifndef GL_KHR_texture_compression_astc_sliced_3d +#define GL_KHR_texture_compression_astc_sliced_3d 1 + +#define GLEW_KHR_texture_compression_astc_sliced_3d GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_sliced_3d) + +#endif /* GL_KHR_texture_compression_astc_sliced_3d */ + +/* -------------------------- 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_shader_integer_functions ------------------- */ + +#ifndef GL_MESA_shader_integer_functions +#define GL_MESA_shader_integer_functions 1 + +#define GLEW_MESA_shader_integer_functions GLEW_GET_VAR(__GLEW_MESA_shader_integer_functions) + +#endif /* GL_MESA_shader_integer_functions */ + +/* --------------------------- 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_blend_equation_advanced_multi_draw_buffers ----------- */ + +#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers +#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 + +#define GLEW_NVX_blend_equation_advanced_multi_draw_buffers GLEW_GET_VAR(__GLEW_NVX_blend_equation_advanced_multi_draw_buffers) + +#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ + +/* ----------------------- GL_NVX_conditional_render ----------------------- */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); + +#define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) +#define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) + +#define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) + +#endif /* GL_NVX_conditional_render */ + +/* ------------------------- 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_NVX_linked_gpu_multicast ---------------------- */ + +#ifndef GL_NVX_linked_gpu_multicast +#define GL_NVX_linked_gpu_multicast 1 + +#define GL_LGPU_SEPARATE_STORAGE_BIT_NVX 0x0800 +#define GL_MAX_LGPU_GPUS_NVX 0x92BA + +typedef void (GLAPIENTRY * PFNGLLGPUCOPYIMAGESUBDATANVXPROC) (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAPIENTRY * PFNGLLGPUINTERLOCKNVXPROC) (void); +typedef void (GLAPIENTRY * PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); + +#define glLGPUCopyImageSubDataNVX GLEW_GET_FUN(__glewLGPUCopyImageSubDataNVX) +#define glLGPUInterlockNVX GLEW_GET_FUN(__glewLGPUInterlockNVX) +#define glLGPUNamedBufferSubDataNVX GLEW_GET_FUN(__glewLGPUNamedBufferSubDataNVX) + +#define GLEW_NVX_linked_gpu_multicast GLEW_GET_VAR(__GLEW_NVX_linked_gpu_multicast) + +#endif /* GL_NVX_linked_gpu_multicast */ + +/* ------------------------ GL_NV_3dvision_settings ------------------------ */ + +#ifndef GL_NV_3dvision_settings +#define GL_NV_3dvision_settings 1 + +#define GL_3DVISION_STEREO_NV 0x90F4 +#define GL_STEREO_SEPARATION_NV 0x90F5 +#define GL_STEREO_CONVERGENCE_NV 0x90F6 +#define GL_STEREO_CUTOFF_NV 0x90F7 +#define GL_STEREO_PROJECTION_NV 0x90F8 +#define GL_STEREO_PROJECTION_PERSPECTIVE_NV 0x90F9 +#define GL_STEREO_PROJECTION_ORTHO_NV 0x90FA + +typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERINVPROC) (GLenum pname, GLint param); + +#define glStereoParameterfNV GLEW_GET_FUN(__glewStereoParameterfNV) +#define glStereoParameteriNV GLEW_GET_FUN(__glewStereoParameteriNV) + +#define GLEW_NV_3dvision_settings GLEW_GET_VAR(__GLEW_NV_3dvision_settings) + +#endif /* GL_NV_3dvision_settings */ + +/* ------------------- GL_NV_EGL_stream_consumer_external ------------------ */ + +#ifndef GL_NV_EGL_stream_consumer_external +#define GL_NV_EGL_stream_consumer_external 1 + +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#define GL_SAMPLER_EXTERNAL_OES 0x8D66 +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 + +#define GLEW_NV_EGL_stream_consumer_external GLEW_GET_VAR(__GLEW_NV_EGL_stream_consumer_external) + +#endif /* GL_NV_EGL_stream_consumer_external */ + +/* ----------------- GL_NV_alpha_to_coverage_dither_control ---------------- */ + +#ifndef GL_NV_alpha_to_coverage_dither_control +#define GL_NV_alpha_to_coverage_dither_control 1 + +#define GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV 0x92BF +#define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D +#define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E +#define GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV 0x934F + +#define GLEW_NV_alpha_to_coverage_dither_control GLEW_GET_VAR(__GLEW_NV_alpha_to_coverage_dither_control) + +#endif /* GL_NV_alpha_to_coverage_dither_control */ + +/* ------------------------------- GL_NV_bgr ------------------------------- */ + +#ifndef GL_NV_bgr +#define GL_NV_bgr 1 + +#define GL_BGR_NV 0x80E0 + +#define GLEW_NV_bgr GLEW_GET_VAR(__GLEW_NV_bgr) + +#endif /* GL_NV_bgr */ + +/* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); + +#define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) +#define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) + +#define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) + +#endif /* GL_NV_bindless_multi_draw_indirect */ + +/* ---------------- GL_NV_bindless_multi_draw_indirect_count --------------- */ + +#ifndef GL_NV_bindless_multi_draw_indirect_count +#define GL_NV_bindless_multi_draw_indirect_count 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); + +#define glMultiDrawArraysIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessCountNV) +#define glMultiDrawElementsIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessCountNV) + +#define GLEW_NV_bindless_multi_draw_indirect_count GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect_count) + +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +/* ------------------------- GL_NV_bindless_texture ------------------------ */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 + +typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value); + +#define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV) +#define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV) +#define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV) +#define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV) +#define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV) +#define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV) +#define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV) +#define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV) +#define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV) +#define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV) +#define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV) +#define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV) +#define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV) + +#define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture) + +#endif /* GL_NV_bindless_texture */ + +/* --------------------- GL_NV_blend_equation_advanced --------------------- */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 + +#define GL_XOR_NV 0x1506 +#define GL_RED_NV 0x1903 +#define GL_GREEN_NV 0x1904 +#define GL_BLUE_NV 0x1905 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_DISJOINT_NV 0x9283 +#define GL_CONJOINT_NV 0x9284 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#define GL_SRC_NV 0x9286 +#define GL_DST_NV 0x9287 +#define GL_SRC_OVER_NV 0x9288 +#define GL_DST_OVER_NV 0x9289 +#define GL_SRC_IN_NV 0x928A +#define GL_DST_IN_NV 0x928B +#define GL_SRC_OUT_NV 0x928C +#define GL_DST_OUT_NV 0x928D +#define GL_SRC_ATOP_NV 0x928E +#define GL_DST_ATOP_NV 0x928F +#define GL_PLUS_NV 0x9291 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_MULTIPLY_NV 0x9294 +#define GL_SCREEN_NV 0x9295 +#define GL_OVERLAY_NV 0x9296 +#define GL_DARKEN_NV 0x9297 +#define GL_LIGHTEN_NV 0x9298 +#define GL_COLORDODGE_NV 0x9299 +#define GL_COLORBURN_NV 0x929A +#define GL_HARDLIGHT_NV 0x929B +#define GL_SOFTLIGHT_NV 0x929C +#define GL_DIFFERENCE_NV 0x929E +#define GL_MINUS_NV 0x929F +#define GL_EXCLUSION_NV 0x92A0 +#define GL_CONTRAST_NV 0x92A1 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_INVERT_OVG_NV 0x92B4 + +typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); + +#define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) +#define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) + +#define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) + +#endif /* GL_NV_blend_equation_advanced */ + +/* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 + +#define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) + +#endif /* GL_NV_blend_equation_advanced_coherent */ + +/* ----------------------- GL_NV_blend_minmax_factor ----------------------- */ + +#ifndef GL_NV_blend_minmax_factor +#define GL_NV_blend_minmax_factor 1 + +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D + +#define GLEW_NV_blend_minmax_factor GLEW_GET_VAR(__GLEW_NV_blend_minmax_factor) + +#endif /* GL_NV_blend_minmax_factor */ + +/* --------------------------- 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_clip_space_w_scaling ---------------------- */ + +#ifndef GL_NV_clip_space_w_scaling +#define GL_NV_clip_space_w_scaling 1 + +#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C +#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D +#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E + +typedef void (GLAPIENTRY * PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); + +#define glViewportPositionWScaleNV GLEW_GET_FUN(__glewViewportPositionWScaleNV) + +#define GLEW_NV_clip_space_w_scaling GLEW_GET_VAR(__GLEW_NV_clip_space_w_scaling) + +#endif /* GL_NV_clip_space_w_scaling */ + +/* --------------------------- GL_NV_command_list -------------------------- */ + +#ifndef GL_NV_command_list +#define GL_NV_command_list 1 + +#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 +#define GL_NOP_COMMAND_NV 0x0001 +#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 +#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 +#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 +#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 +#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 +#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 +#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 +#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 +#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000a +#define GL_BLEND_COLOR_COMMAND_NV 0x000b +#define GL_STENCIL_REF_COMMAND_NV 0x000c +#define GL_LINE_WIDTH_COMMAND_NV 0x000d +#define GL_POLYGON_OFFSET_COMMAND_NV 0x000e +#define GL_ALPHA_REF_COMMAND_NV 0x000f +#define GL_VIEWPORT_COMMAND_NV 0x0010 +#define GL_SCISSOR_COMMAND_NV 0x0011 +#define GL_FRONT_FACE_COMMAND_NV 0x0012 + +typedef void (GLAPIENTRY * PFNGLCALLCOMMANDLISTNVPROC) (GLuint list); +typedef void (GLAPIENTRY * PFNGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); +typedef void (GLAPIENTRY * PFNGLCOMPILECOMMANDLISTNVPROC) (GLuint list); +typedef void (GLAPIENTRY * PFNGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint* lists); +typedef void (GLAPIENTRY * PFNGLCREATESTATESNVPROC) (GLsizei n, GLuint* states); +typedef void (GLAPIENTRY * PFNGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint* lists); +typedef void (GLAPIENTRY * PFNGLDELETESTATESNVPROC) (GLsizei n, const GLuint* states); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64* indirects, const GLsizei* sizes, GLuint count); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, GLuint count); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); +typedef GLuint (GLAPIENTRY * PFNGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); +typedef GLushort (GLAPIENTRY * PFNGLGETSTAGEINDEXNVPROC) (GLenum shadertype); +typedef GLboolean (GLAPIENTRY * PFNGLISCOMMANDLISTNVPROC) (GLuint list); +typedef GLboolean (GLAPIENTRY * PFNGLISSTATENVPROC) (GLuint state); +typedef void (GLAPIENTRY * PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void** indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); +typedef void (GLAPIENTRY * PFNGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); + +#define glCallCommandListNV GLEW_GET_FUN(__glewCallCommandListNV) +#define glCommandListSegmentsNV GLEW_GET_FUN(__glewCommandListSegmentsNV) +#define glCompileCommandListNV GLEW_GET_FUN(__glewCompileCommandListNV) +#define glCreateCommandListsNV GLEW_GET_FUN(__glewCreateCommandListsNV) +#define glCreateStatesNV GLEW_GET_FUN(__glewCreateStatesNV) +#define glDeleteCommandListsNV GLEW_GET_FUN(__glewDeleteCommandListsNV) +#define glDeleteStatesNV GLEW_GET_FUN(__glewDeleteStatesNV) +#define glDrawCommandsAddressNV GLEW_GET_FUN(__glewDrawCommandsAddressNV) +#define glDrawCommandsNV GLEW_GET_FUN(__glewDrawCommandsNV) +#define glDrawCommandsStatesAddressNV GLEW_GET_FUN(__glewDrawCommandsStatesAddressNV) +#define glDrawCommandsStatesNV GLEW_GET_FUN(__glewDrawCommandsStatesNV) +#define glGetCommandHeaderNV GLEW_GET_FUN(__glewGetCommandHeaderNV) +#define glGetStageIndexNV GLEW_GET_FUN(__glewGetStageIndexNV) +#define glIsCommandListNV GLEW_GET_FUN(__glewIsCommandListNV) +#define glIsStateNV GLEW_GET_FUN(__glewIsStateNV) +#define glListDrawCommandsStatesClientNV GLEW_GET_FUN(__glewListDrawCommandsStatesClientNV) +#define glStateCaptureNV GLEW_GET_FUN(__glewStateCaptureNV) + +#define GLEW_NV_command_list GLEW_GET_VAR(__GLEW_NV_command_list) + +#endif /* GL_NV_command_list */ + +/* ------------------------- GL_NV_compute_program5 ------------------------ */ + +#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 + +#define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) + +#endif /* GL_NV_compute_program5 */ + +/* ------------------------ 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_conservative_raster ----------------------- */ + +#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 (GLAPIENTRY * PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); + +#define glSubpixelPrecisionBiasNV GLEW_GET_FUN(__glewSubpixelPrecisionBiasNV) + +#define GLEW_NV_conservative_raster GLEW_GET_VAR(__GLEW_NV_conservative_raster) + +#endif /* GL_NV_conservative_raster */ + +/* -------------------- GL_NV_conservative_raster_dilate ------------------- */ + +#ifndef GL_NV_conservative_raster_dilate +#define GL_NV_conservative_raster_dilate 1 + +#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 +#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A +#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B + +typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); + +#define glConservativeRasterParameterfNV GLEW_GET_FUN(__glewConservativeRasterParameterfNV) + +#define GLEW_NV_conservative_raster_dilate GLEW_GET_VAR(__GLEW_NV_conservative_raster_dilate) + +#endif /* GL_NV_conservative_raster_dilate */ + +/* -------------- GL_NV_conservative_raster_pre_snap_triangles ------------- */ + +#ifndef GL_NV_conservative_raster_pre_snap_triangles +#define GL_NV_conservative_raster_pre_snap_triangles 1 + +#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D +#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F + +typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); + +#define glConservativeRasterParameteriNV GLEW_GET_FUN(__glewConservativeRasterParameteriNV) + +#define GLEW_NV_conservative_raster_pre_snap_triangles GLEW_GET_VAR(__GLEW_NV_conservative_raster_pre_snap_triangles) + +#endif /* GL_NV_conservative_raster_pre_snap_triangles */ + +/* --------------------------- GL_NV_copy_buffer --------------------------- */ + +#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 (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); + +#define glCopyBufferSubDataNV GLEW_GET_FUN(__glewCopyBufferSubDataNV) + +#define GLEW_NV_copy_buffer GLEW_GET_VAR(__GLEW_NV_copy_buffer) + +#endif /* GL_NV_copy_buffer */ + +/* ----------------------- 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_deep_texture3D ------------------------- */ + +#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 + +#define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) + +#endif /* GL_NV_deep_texture3D */ + +/* ------------------------ 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_draw_buffers -------------------------- */ + +#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 (GLAPIENTRY * PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersNV GLEW_GET_FUN(__glewDrawBuffersNV) + +#define GLEW_NV_draw_buffers GLEW_GET_VAR(__GLEW_NV_draw_buffers) + +#endif /* GL_NV_draw_buffers */ + +/* -------------------------- GL_NV_draw_instanced ------------------------- */ + +#ifndef GL_NV_draw_instanced +#define GL_NV_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + +#define glDrawArraysInstancedNV GLEW_GET_FUN(__glewDrawArraysInstancedNV) +#define glDrawElementsInstancedNV GLEW_GET_FUN(__glewDrawElementsInstancedNV) + +#define GLEW_NV_draw_instanced GLEW_GET_VAR(__GLEW_NV_draw_instanced) + +#endif /* GL_NV_draw_instanced */ + +/* --------------------------- GL_NV_draw_texture -------------------------- */ + +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 + +typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); + +#define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) + +#define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) + +#endif /* GL_NV_draw_texture */ + +/* ------------------------ GL_NV_draw_vulkan_image ------------------------ */ + +#ifndef GL_NV_draw_vulkan_image +#define GL_NV_draw_vulkan_image 1 + +typedef void (APIENTRY *GLVULKANPROCNV)(void); + +typedef void (GLAPIENTRY * PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +typedef GLVULKANPROCNV (GLAPIENTRY * PFNGLGETVKPROCADDRNVPROC) (const GLchar* name); +typedef void (GLAPIENTRY * PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); +typedef void (GLAPIENTRY * PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (GLAPIENTRY * PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); + +#define glDrawVkImageNV GLEW_GET_FUN(__glewDrawVkImageNV) +#define glGetVkProcAddrNV GLEW_GET_FUN(__glewGetVkProcAddrNV) +#define glSignalVkFenceNV GLEW_GET_FUN(__glewSignalVkFenceNV) +#define glSignalVkSemaphoreNV GLEW_GET_FUN(__glewSignalVkSemaphoreNV) +#define glWaitVkSemaphoreNV GLEW_GET_FUN(__glewWaitVkSemaphoreNV) + +#define GLEW_NV_draw_vulkan_image GLEW_GET_VAR(__GLEW_NV_draw_vulkan_image) + +#endif /* GL_NV_draw_vulkan_image */ + +/* ---------------------------- 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_attrib_location -------------------- */ + +#ifndef GL_NV_explicit_attrib_location +#define GL_NV_explicit_attrib_location 1 + +#define GLEW_NV_explicit_attrib_location GLEW_GET_VAR(__GLEW_NV_explicit_attrib_location) + +#endif /* GL_NV_explicit_attrib_location */ + +/* ----------------------- 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_fbo_color_attachments ---------------------- */ + +#ifndef GL_NV_fbo_color_attachments +#define GL_NV_fbo_color_attachments 1 + +#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF +#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 + +#define GLEW_NV_fbo_color_attachments GLEW_GET_VAR(__GLEW_NV_fbo_color_attachments) + +#endif /* GL_NV_fbo_color_attachments */ + +/* ------------------------------ 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_fill_rectangle ------------------------- */ + +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 + +#define GL_FILL_RECTANGLE_NV 0x933C + +#define GLEW_NV_fill_rectangle GLEW_GET_VAR(__GLEW_NV_fill_rectangle) + +#endif /* GL_NV_fill_rectangle */ + +/* --------------------------- 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_coverage_to_color ------------------- */ + +#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 (GLAPIENTRY * PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); + +#define glFragmentCoverageColorNV GLEW_GET_FUN(__glewFragmentCoverageColorNV) + +#define GLEW_NV_fragment_coverage_to_color GLEW_GET_VAR(__GLEW_NV_fragment_coverage_to_color) + +#endif /* GL_NV_fragment_coverage_to_color */ + +/* ------------------------- 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_fragment_shader_interlock -------------------- */ + +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 + +#define GLEW_NV_fragment_shader_interlock GLEW_GET_VAR(__GLEW_NV_fragment_shader_interlock) + +#endif /* GL_NV_fragment_shader_interlock */ + +/* ------------------------- GL_NV_framebuffer_blit ------------------------ */ + +#ifndef GL_NV_framebuffer_blit +#define GL_NV_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 +#define GL_READ_FRAMEBUFFER_NV 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferNV GLEW_GET_FUN(__glewBlitFramebufferNV) + +#define GLEW_NV_framebuffer_blit GLEW_GET_VAR(__GLEW_NV_framebuffer_blit) + +#endif /* GL_NV_framebuffer_blit */ + +/* -------------------- GL_NV_framebuffer_mixed_samples -------------------- */ + +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 +#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 +#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_TABLE_NV 0x9331 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 + +#define GLEW_NV_framebuffer_mixed_samples GLEW_GET_VAR(__GLEW_NV_framebuffer_mixed_samples) + +#endif /* GL_NV_framebuffer_mixed_samples */ + +/* --------------------- GL_NV_framebuffer_multisample --------------------- */ + +#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 (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleNV) + +#define GLEW_NV_framebuffer_multisample GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample) + +#endif /* GL_NV_framebuffer_multisample */ + +/* ----------------- 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_generate_mipmap_sRGB ---------------------- */ + +#ifndef GL_NV_generate_mipmap_sRGB +#define GL_NV_generate_mipmap_sRGB 1 + +#define GLEW_NV_generate_mipmap_sRGB GLEW_GET_VAR(__GLEW_NV_generate_mipmap_sRGB) + +#endif /* GL_NV_generate_mipmap_sRGB */ + +/* ------------------------ 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_geometry_shader_passthrough ------------------- */ + +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 + +#define GLEW_NV_geometry_shader_passthrough GLEW_GET_VAR(__GLEW_NV_geometry_shader_passthrough) + +#endif /* GL_NV_geometry_shader_passthrough */ + +/* -------------------------- GL_NV_gpu_multicast -------------------------- */ + +#ifndef GL_NV_gpu_multicast +#define GL_NV_gpu_multicast 1 + +#define GL_PER_GPU_STORAGE_BIT_NV 0x0800 +#define GL_MULTICAST_GPUS_NV 0x92BA +#define GL_PER_GPU_STORAGE_NV 0x9548 +#define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549 +#define GL_RENDER_GPU_MASK_NV 0x9558 + +typedef void (GLAPIENTRY * PFNGLMULTICASTBARRIERNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLMULTICASTBLITFRAMEBUFFERNVPROC) (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAPIENTRY * PFNGLMULTICASTBUFFERSUBDATANVPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC) (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYIMAGESUBDATANVPROC) (GLuint srcGpu, GLbitfield dstGpuMask, 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 (GLAPIENTRY * PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTWAITSYNCNVPROC) (GLuint signalGpu, GLbitfield waitGpuMask); +typedef void (GLAPIENTRY * PFNGLRENDERGPUMASKNVPROC) (GLbitfield mask); + +#define glMulticastBarrierNV GLEW_GET_FUN(__glewMulticastBarrierNV) +#define glMulticastBlitFramebufferNV GLEW_GET_FUN(__glewMulticastBlitFramebufferNV) +#define glMulticastBufferSubDataNV GLEW_GET_FUN(__glewMulticastBufferSubDataNV) +#define glMulticastCopyBufferSubDataNV GLEW_GET_FUN(__glewMulticastCopyBufferSubDataNV) +#define glMulticastCopyImageSubDataNV GLEW_GET_FUN(__glewMulticastCopyImageSubDataNV) +#define glMulticastFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewMulticastFramebufferSampleLocationsfvNV) +#define glMulticastGetQueryObjecti64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjecti64vNV) +#define glMulticastGetQueryObjectivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectivNV) +#define glMulticastGetQueryObjectui64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjectui64vNV) +#define glMulticastGetQueryObjectuivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectuivNV) +#define glMulticastWaitSyncNV GLEW_GET_FUN(__glewMulticastWaitSyncNV) +#define glRenderGpuMaskNV GLEW_GET_FUN(__glewRenderGpuMaskNV) + +#define GLEW_NV_gpu_multicast GLEW_GET_VAR(__GLEW_NV_gpu_multicast) + +#endif /* GL_NV_gpu_multicast */ + +/* --------------------------- 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_program5_mem_extended -------------------- */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 + +#define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) + +#endif /* GL_NV_gpu_program5_mem_extended */ + +/* ------------------------- 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_image_formats -------------------------- */ + +#ifndef GL_NV_image_formats +#define GL_NV_image_formats 1 + +#define GLEW_NV_image_formats GLEW_GET_VAR(__GLEW_NV_image_formats) + +#endif /* GL_NV_image_formats */ + +/* ------------------------- GL_NV_instanced_arrays ------------------------ */ + +#ifndef GL_NV_instanced_arrays +#define GL_NV_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisorNV GLEW_GET_FUN(__glewVertexAttribDivisorNV) + +#define GLEW_NV_instanced_arrays GLEW_GET_VAR(__GLEW_NV_instanced_arrays) + +#endif /* GL_NV_instanced_arrays */ + +/* ------------------- GL_NV_internalformat_sample_query ------------------- */ + +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 + +#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 (GLAPIENTRY * PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params); + +#define glGetInternalformatSampleivNV GLEW_GET_FUN(__glewGetInternalformatSampleivNV) + +#define GLEW_NV_internalformat_sample_query GLEW_GET_VAR(__GLEW_NV_internalformat_sample_query) + +#endif /* GL_NV_internalformat_sample_query */ + +/* ------------------------ 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_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_non_square_matrices ----------------------- */ + +#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 (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); + +#define glUniformMatrix2x3fvNV GLEW_GET_FUN(__glewUniformMatrix2x3fvNV) +#define glUniformMatrix2x4fvNV GLEW_GET_FUN(__glewUniformMatrix2x4fvNV) +#define glUniformMatrix3x2fvNV GLEW_GET_FUN(__glewUniformMatrix3x2fvNV) +#define glUniformMatrix3x4fvNV GLEW_GET_FUN(__glewUniformMatrix3x4fvNV) +#define glUniformMatrix4x2fvNV GLEW_GET_FUN(__glewUniformMatrix4x2fvNV) +#define glUniformMatrix4x3fvNV GLEW_GET_FUN(__glewUniformMatrix4x3fvNV) + +#define GLEW_NV_non_square_matrices GLEW_GET_VAR(__GLEW_NV_non_square_matrices) + +#endif /* GL_NV_non_square_matrices */ + +/* ------------------------- 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_pack_subimage -------------------------- */ + +#ifndef GL_NV_pack_subimage +#define GL_NV_pack_subimage 1 + +#define GL_PACK_ROW_LENGTH_NV 0x0D02 +#define GL_PACK_SKIP_ROWS_NV 0x0D03 +#define GL_PACK_SKIP_PIXELS_NV 0x0D04 + +#define GLEW_NV_pack_subimage GLEW_GET_VAR(__GLEW_NV_pack_subimage) + +#endif /* GL_NV_pack_subimage */ + +/* ----------------------- 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_packed_float -------------------------- */ + +#ifndef GL_NV_packed_float +#define GL_NV_packed_float 1 + +#define GL_R11F_G11F_B10F_NV 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B + +#define GLEW_NV_packed_float GLEW_GET_VAR(__GLEW_NV_packed_float) + +#endif /* GL_NV_packed_float */ + +/* ----------------------- GL_NV_packed_float_linear ----------------------- */ + +#ifndef GL_NV_packed_float_linear +#define GL_NV_packed_float_linear 1 + +#define GL_R11F_G11F_B10F_NV 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B + +#define GLEW_NV_packed_float_linear GLEW_GET_VAR(__GLEW_NV_packed_float_linear) + +#endif /* GL_NV_packed_float_linear */ + +/* --------------------- 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_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#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_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_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#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_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_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_RELATIVE_RECT_NV 0xF7 +#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_BIT_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_PATH_STROKE_BOUND_NV 0x9086 +#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_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_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_FRAGMENT_INPUT_NV 0x936D +#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_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 + +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 path, 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 path, GLubyte* commands); +typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat* coords); +typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat* dashArray); +typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, 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 path, GLenum pname, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, 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 * PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLfloat *params); +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 * PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +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 void*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 GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +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 void*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GLAPIENTRY * PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, 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, GLfloat 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 void*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 * PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs); +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 * PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +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 glGetProgramResourcefvNV GLEW_GET_FUN(__glewGetProgramResourcefvNV) +#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 glMatrixLoad3x2fNV GLEW_GET_FUN(__glewMatrixLoad3x2fNV) +#define glMatrixLoad3x3fNV GLEW_GET_FUN(__glewMatrixLoad3x3fNV) +#define glMatrixLoadTranspose3x3fNV GLEW_GET_FUN(__glewMatrixLoadTranspose3x3fNV) +#define glMatrixMult3x2fNV GLEW_GET_FUN(__glewMatrixMult3x2fNV) +#define glMatrixMult3x3fNV GLEW_GET_FUN(__glewMatrixMult3x3fNV) +#define glMatrixMultTranspose3x3fNV GLEW_GET_FUN(__glewMatrixMultTranspose3x3fNV) +#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 glPathGlyphIndexArrayNV GLEW_GET_FUN(__glewPathGlyphIndexArrayNV) +#define glPathGlyphIndexRangeNV GLEW_GET_FUN(__glewPathGlyphIndexRangeNV) +#define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV) +#define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV) +#define glPathMemoryGlyphIndexArrayNV GLEW_GET_FUN(__glewPathMemoryGlyphIndexArrayNV) +#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 glProgramPathFragmentInputGenNV GLEW_GET_FUN(__glewProgramPathFragmentInputGenNV) +#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 glStencilThenCoverFillPathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverFillPathInstancedNV) +#define glStencilThenCoverFillPathNV GLEW_GET_FUN(__glewStencilThenCoverFillPathNV) +#define glStencilThenCoverStrokePathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathInstancedNV) +#define glStencilThenCoverStrokePathNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathNV) +#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_path_rendering_shared_edge ------------------- */ + +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 + +#define GL_SHARED_EDGE_NV 0xC0 + +#define GLEW_NV_path_rendering_shared_edge GLEW_GET_VAR(__GLEW_NV_path_rendering_shared_edge) + +#endif /* GL_NV_path_rendering_shared_edge */ + +/* ----------------------- GL_NV_pixel_buffer_object ----------------------- */ + +#ifndef GL_NV_pixel_buffer_object +#define GL_NV_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_NV 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF + +#define GLEW_NV_pixel_buffer_object GLEW_GET_VAR(__GLEW_NV_pixel_buffer_object) + +#endif /* GL_NV_pixel_buffer_object */ + +/* ------------------------- 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_platform_binary ------------------------- */ + +#ifndef GL_NV_platform_binary +#define GL_NV_platform_binary 1 + +#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B + +#define GLEW_NV_platform_binary GLEW_GET_VAR(__GLEW_NV_platform_binary) + +#endif /* GL_NV_platform_binary */ + +/* --------------------------- 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_polygon_mode -------------------------- */ + +#ifndef GL_NV_polygon_mode +#define GL_NV_polygon_mode 1 + +#define GL_POLYGON_MODE_NV 0x0B40 +#define GL_POINT_NV 0x1B00 +#define GL_LINE_NV 0x1B01 +#define GL_FILL_NV 0x1B02 +#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 +#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 + +typedef void (GLAPIENTRY * PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode); + +#define glPolygonModeNV GLEW_GET_FUN(__glewPolygonModeNV) + +#define GLEW_NV_polygon_mode GLEW_GET_VAR(__GLEW_NV_polygon_mode) + +#endif /* GL_NV_polygon_mode */ + +/* -------------------------- 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_read_depth --------------------------- */ + +#ifndef GL_NV_read_depth +#define GL_NV_read_depth 1 + +#define GLEW_NV_read_depth GLEW_GET_VAR(__GLEW_NV_read_depth) + +#endif /* GL_NV_read_depth */ + +/* ------------------------ GL_NV_read_depth_stencil ----------------------- */ + +#ifndef GL_NV_read_depth_stencil +#define GL_NV_read_depth_stencil 1 + +#define GLEW_NV_read_depth_stencil GLEW_GET_VAR(__GLEW_NV_read_depth_stencil) + +#endif /* GL_NV_read_depth_stencil */ + +/* --------------------------- GL_NV_read_stencil -------------------------- */ + +#ifndef GL_NV_read_stencil +#define GL_NV_read_stencil 1 + +#define GLEW_NV_read_stencil GLEW_GET_VAR(__GLEW_NV_read_stencil) + +#endif /* GL_NV_read_stencil */ + +/* ------------------------ 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_robustness_video_memory_purge ------------------ */ + +#ifndef GL_NV_robustness_video_memory_purge +#define GL_NV_robustness_video_memory_purge 1 + +#define GL_EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C +#define GL_PURGED_CONTEXT_RESET_NV 0x92BB + +#define GLEW_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_NV_robustness_video_memory_purge) + +#endif /* GL_NV_robustness_video_memory_purge */ + +/* --------------------------- GL_NV_sRGB_formats -------------------------- */ + +#ifndef GL_NV_sRGB_formats +#define GL_NV_sRGB_formats 1 + +#define GL_ETC1_SRGB8_NV 0x88EE +#define GL_SRGB8_NV 0x8C41 +#define GL_SLUMINANCE_ALPHA_NV 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 +#define GL_SLUMINANCE_NV 0x8C46 +#define GL_SLUMINANCE8_NV 0x8C47 +#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 GLEW_NV_sRGB_formats GLEW_GET_VAR(__GLEW_NV_sRGB_formats) + +#endif /* GL_NV_sRGB_formats */ + +/* ------------------------- GL_NV_sample_locations ------------------------ */ + +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 + +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#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_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); + +#define glFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewFramebufferSampleLocationsfvNV) +#define glNamedFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvNV) + +#define GLEW_NV_sample_locations GLEW_GET_VAR(__GLEW_NV_sample_locations) + +#endif /* GL_NV_sample_locations */ + +/* ------------------ GL_NV_sample_mask_override_coverage ------------------ */ + +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 + +#define GLEW_NV_sample_mask_override_coverage GLEW_GET_VAR(__GLEW_NV_sample_mask_override_coverage) + +#endif /* GL_NV_sample_mask_override_coverage */ + +/* ---------------------- GL_NV_shader_atomic_counters --------------------- */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 + +#define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) + +#endif /* GL_NV_shader_atomic_counters */ + +/* ----------------------- GL_NV_shader_atomic_float ----------------------- */ + +#ifndef GL_NV_shader_atomic_float +#define GL_NV_shader_atomic_float 1 + +#define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float) + +#endif /* GL_NV_shader_atomic_float */ + +/* ---------------------- GL_NV_shader_atomic_float64 ---------------------- */ + +#ifndef GL_NV_shader_atomic_float64 +#define GL_NV_shader_atomic_float64 1 + +#define GLEW_NV_shader_atomic_float64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_float64) + +#endif /* GL_NV_shader_atomic_float64 */ + +/* -------------------- GL_NV_shader_atomic_fp16_vector -------------------- */ + +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 + +#define GLEW_NV_shader_atomic_fp16_vector GLEW_GET_VAR(__GLEW_NV_shader_atomic_fp16_vector) + +#endif /* GL_NV_shader_atomic_fp16_vector */ + +/* ----------------------- GL_NV_shader_atomic_int64 ----------------------- */ + +#ifndef GL_NV_shader_atomic_int64 +#define GL_NV_shader_atomic_int64 1 + +#define GLEW_NV_shader_atomic_int64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_int64) + +#endif /* GL_NV_shader_atomic_int64 */ + +/* ------------------------ 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_shader_noperspective_interpolation --------------- */ + +#ifndef GL_NV_shader_noperspective_interpolation +#define GL_NV_shader_noperspective_interpolation 1 + +#define GLEW_NV_shader_noperspective_interpolation GLEW_GET_VAR(__GLEW_NV_shader_noperspective_interpolation) + +#endif /* GL_NV_shader_noperspective_interpolation */ + +/* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 + +#define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) + +#endif /* GL_NV_shader_storage_buffer_object */ + +/* ----------------------- GL_NV_shader_thread_group ----------------------- */ + +#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 + +#define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group) + +#endif /* GL_NV_shader_thread_group */ + +/* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 + +#define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle) + +#endif /* GL_NV_shader_thread_shuffle */ + +/* ---------------------- GL_NV_shadow_samplers_array ---------------------- */ + +#ifndef GL_NV_shadow_samplers_array +#define GL_NV_shadow_samplers_array 1 + +#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 + +#define GLEW_NV_shadow_samplers_array GLEW_GET_VAR(__GLEW_NV_shadow_samplers_array) + +#endif /* GL_NV_shadow_samplers_array */ + +/* ----------------------- GL_NV_shadow_samplers_cube ---------------------- */ + +#ifndef GL_NV_shadow_samplers_cube +#define GL_NV_shadow_samplers_cube 1 + +#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 + +#define GLEW_NV_shadow_samplers_cube GLEW_GET_VAR(__GLEW_NV_shadow_samplers_cube) + +#endif /* GL_NV_shadow_samplers_cube */ + +/* ---------------------- GL_NV_stereo_view_rendering ---------------------- */ + +#ifndef GL_NV_stereo_view_rendering +#define GL_NV_stereo_view_rendering 1 + +#define GLEW_NV_stereo_view_rendering GLEW_GET_VAR(__GLEW_NV_stereo_view_rendering) + +#endif /* GL_NV_stereo_view_rendering */ + +/* ---------------------- 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_array -------------------------- */ + +#ifndef GL_NV_texture_array +#define GL_NV_texture_array 1 + +#define GL_UNPACK_SKIP_IMAGES_NV 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_NV 0x806E +#define GL_MAX_ARRAY_TEXTURE_LAYERS_NV 0x88FF +#define GL_TEXTURE_2D_ARRAY_NV 0x8C1A +#define GL_TEXTURE_BINDING_2D_ARRAY_NV 0x8C1D +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_NV 0x8CD4 +#define GL_SAMPLER_2D_ARRAY_NV 0x8DC1 + +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC) (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 * PFNGLCOPYTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERNVPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + +#define glCompressedTexImage3DNV GLEW_GET_FUN(__glewCompressedTexImage3DNV) +#define glCompressedTexSubImage3DNV GLEW_GET_FUN(__glewCompressedTexSubImage3DNV) +#define glCopyTexSubImage3DNV GLEW_GET_FUN(__glewCopyTexSubImage3DNV) +#define glFramebufferTextureLayerNV GLEW_GET_FUN(__glewFramebufferTextureLayerNV) +#define glTexImage3DNV GLEW_GET_FUN(__glewTexImage3DNV) +#define glTexSubImage3DNV GLEW_GET_FUN(__glewTexSubImage3DNV) + +#define GLEW_NV_texture_array GLEW_GET_VAR(__GLEW_NV_texture_array) + +#endif /* GL_NV_texture_array */ + +/* ------------------------- 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_border_clamp ---------------------- */ + +#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 + +#define GLEW_NV_texture_border_clamp GLEW_GET_VAR(__GLEW_NV_texture_border_clamp) + +#endif /* GL_NV_texture_border_clamp */ + +/* --------------------- GL_NV_texture_compression_latc -------------------- */ + +#ifndef GL_NV_texture_compression_latc +#define GL_NV_texture_compression_latc 1 + +#define GL_COMPRESSED_LUMINANCE_LATC1_NV 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_NV 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_NV 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_NV 0x8C73 + +#define GLEW_NV_texture_compression_latc GLEW_GET_VAR(__GLEW_NV_texture_compression_latc) + +#endif /* GL_NV_texture_compression_latc */ + +/* --------------------- GL_NV_texture_compression_s3tc -------------------- */ + +#ifndef GL_NV_texture_compression_s3tc +#define GL_NV_texture_compression_s3tc 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_NV 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_NV 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_NV 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_NV 0x83F3 + +#define GLEW_NV_texture_compression_s3tc GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc) + +#endif /* GL_NV_texture_compression_s3tc */ + +/* ----------------- GL_NV_texture_compression_s3tc_update ----------------- */ + +#ifndef GL_NV_texture_compression_s3tc_update +#define GL_NV_texture_compression_s3tc_update 1 + +#define GLEW_NV_texture_compression_s3tc_update GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc_update) + +#endif /* GL_NV_texture_compression_s3tc_update */ + +/* --------------------- 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_npot_2D_mipmap --------------------- */ + +#ifndef GL_NV_texture_npot_2D_mipmap +#define GL_NV_texture_npot_2D_mipmap 1 + +#define GLEW_NV_texture_npot_2D_mipmap GLEW_GET_VAR(__GLEW_NV_texture_npot_2D_mipmap) + +#endif /* GL_NV_texture_npot_2D_mipmap */ + +/* ------------------------ 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_rectangle_compressed ------------------ */ + +#ifndef GL_NV_texture_rectangle_compressed +#define GL_NV_texture_rectangle_compressed 1 + +#define GLEW_NV_texture_rectangle_compressed GLEW_GET_VAR(__GLEW_NV_texture_rectangle_compressed) + +#endif /* GL_NV_texture_rectangle_compressed */ + +/* -------------------------- 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_2D_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_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_uniform_buffer_unified_memory ------------------ */ + +#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 + +#define GLEW_NV_uniform_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_uniform_buffer_unified_memory) + +#endif /* GL_NV_uniform_buffer_unified_memory */ + +/* -------------------------- 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 void*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, void** 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_NV_viewport_array ------------------------- */ + +#ifndef GL_NV_viewport_array +#define GL_NV_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_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 (GLAPIENTRY * PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f); +typedef void (GLAPIENTRY * PFNGLDISABLEINVPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEINVPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat* data); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINVPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint * v); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat * v); + +#define glDepthRangeArrayfvNV GLEW_GET_FUN(__glewDepthRangeArrayfvNV) +#define glDepthRangeIndexedfNV GLEW_GET_FUN(__glewDepthRangeIndexedfNV) +#define glDisableiNV GLEW_GET_FUN(__glewDisableiNV) +#define glEnableiNV GLEW_GET_FUN(__glewEnableiNV) +#define glGetFloati_vNV GLEW_GET_FUN(__glewGetFloati_vNV) +#define glIsEnablediNV GLEW_GET_FUN(__glewIsEnablediNV) +#define glScissorArrayvNV GLEW_GET_FUN(__glewScissorArrayvNV) +#define glScissorIndexedNV GLEW_GET_FUN(__glewScissorIndexedNV) +#define glScissorIndexedvNV GLEW_GET_FUN(__glewScissorIndexedvNV) +#define glViewportArrayvNV GLEW_GET_FUN(__glewViewportArrayvNV) +#define glViewportIndexedfNV GLEW_GET_FUN(__glewViewportIndexedfNV) +#define glViewportIndexedfvNV GLEW_GET_FUN(__glewViewportIndexedfvNV) + +#define GLEW_NV_viewport_array GLEW_GET_VAR(__GLEW_NV_viewport_array) + +#endif /* GL_NV_viewport_array */ + +/* ------------------------- GL_NV_viewport_array2 ------------------------- */ + +#ifndef GL_NV_viewport_array2 +#define GL_NV_viewport_array2 1 + +#define GLEW_NV_viewport_array2 GLEW_GET_VAR(__GLEW_NV_viewport_array2) + +#endif /* GL_NV_viewport_array2 */ + +/* ------------------------- GL_NV_viewport_swizzle ------------------------ */ + +#ifndef GL_NV_viewport_swizzle +#define GL_NV_viewport_swizzle 1 + +#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 +#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 +#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 +#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A +#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B + +typedef void (GLAPIENTRY * PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); + +#define glViewportSwizzleNV GLEW_GET_FUN(__glewViewportSwizzleNV) + +#define GLEW_NV_viewport_swizzle GLEW_GET_VAR(__GLEW_NV_viewport_swizzle) + +#endif /* GL_NV_viewport_swizzle */ + +/* ------------------------ GL_OES_byte_coordinates ------------------------ */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 + +#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) + +#endif /* GL_OES_byte_coordinates */ + +/* ---------------------------- 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_OVR_multiview --------------------------- */ + +#ifndef GL_OVR_multiview +#define GL_OVR_multiview 1 + +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 +#define GL_MAX_VIEWS_OVR 0x9631 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 +#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); + +#define glFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultiviewOVR) + +#define GLEW_OVR_multiview GLEW_GET_VAR(__GLEW_OVR_multiview) + +#endif /* GL_OVR_multiview */ + +/* --------------------------- GL_OVR_multiview2 --------------------------- */ + +#ifndef GL_OVR_multiview2 +#define GL_OVR_multiview2 1 + +#define GLEW_OVR_multiview2 GLEW_GET_VAR(__GLEW_OVR_multiview2) + +#endif /* GL_OVR_multiview2 */ + +/* ------------ GL_OVR_multiview_multisampled_render_to_texture ------------ */ + +#ifndef GL_OVR_multiview_multisampled_render_to_texture +#define GL_OVR_multiview_multisampled_render_to_texture 1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); + +#define glFramebufferTextureMultisampleMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultisampleMultiviewOVR) + +#define GLEW_OVR_multiview_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_OVR_multiview_multisampled_render_to_texture) + +#endif /* GL_OVR_multiview_multisampled_render_to_texture */ + +/* --------------------------- 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_QCOM_alpha_test -------------------------- */ + +#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 (GLAPIENTRY * PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); + +#define glAlphaFuncQCOM GLEW_GET_FUN(__glewAlphaFuncQCOM) + +#define GLEW_QCOM_alpha_test GLEW_GET_VAR(__GLEW_QCOM_alpha_test) + +#endif /* GL_QCOM_alpha_test */ + +/* ------------------------ GL_QCOM_binning_control ------------------------ */ + +#ifndef GL_QCOM_binning_control +#define GL_QCOM_binning_control 1 + +#define GL_DONT_CARE 0x1100 +#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 + +#define GLEW_QCOM_binning_control GLEW_GET_VAR(__GLEW_QCOM_binning_control) + +#endif /* GL_QCOM_binning_control */ + +/* ------------------------- GL_QCOM_driver_control ------------------------ */ + +#ifndef GL_QCOM_driver_control +#define GL_QCOM_driver_control 1 + +typedef void (GLAPIENTRY * PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GLAPIENTRY * PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei* length, GLchar *driverControlString); +typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint* num, GLsizei size, GLuint *driverControls); + +#define glDisableDriverControlQCOM GLEW_GET_FUN(__glewDisableDriverControlQCOM) +#define glEnableDriverControlQCOM GLEW_GET_FUN(__glewEnableDriverControlQCOM) +#define glGetDriverControlStringQCOM GLEW_GET_FUN(__glewGetDriverControlStringQCOM) +#define glGetDriverControlsQCOM GLEW_GET_FUN(__glewGetDriverControlsQCOM) + +#define GLEW_QCOM_driver_control GLEW_GET_VAR(__GLEW_QCOM_driver_control) + +#endif /* GL_QCOM_driver_control */ + +/* -------------------------- GL_QCOM_extended_get ------------------------- */ + +#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 (GLAPIENTRY * PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void** params); +typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERSQCOMPROC) (GLuint* buffers, GLint maxBuffers, GLint* numBuffers); +typedef void (GLAPIENTRY * PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers); +typedef void (GLAPIENTRY * PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers); +typedef void (GLAPIENTRY * PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * 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 (GLAPIENTRY * PFNGLEXTGETTEXTURESQCOMPROC) (GLuint* textures, GLint maxTextures, GLint* numTextures); +typedef void (GLAPIENTRY * PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); + +#define glExtGetBufferPointervQCOM GLEW_GET_FUN(__glewExtGetBufferPointervQCOM) +#define glExtGetBuffersQCOM GLEW_GET_FUN(__glewExtGetBuffersQCOM) +#define glExtGetFramebuffersQCOM GLEW_GET_FUN(__glewExtGetFramebuffersQCOM) +#define glExtGetRenderbuffersQCOM GLEW_GET_FUN(__glewExtGetRenderbuffersQCOM) +#define glExtGetTexLevelParameterivQCOM GLEW_GET_FUN(__glewExtGetTexLevelParameterivQCOM) +#define glExtGetTexSubImageQCOM GLEW_GET_FUN(__glewExtGetTexSubImageQCOM) +#define glExtGetTexturesQCOM GLEW_GET_FUN(__glewExtGetTexturesQCOM) +#define glExtTexObjectStateOverrideiQCOM GLEW_GET_FUN(__glewExtTexObjectStateOverrideiQCOM) + +#define GLEW_QCOM_extended_get GLEW_GET_VAR(__GLEW_QCOM_extended_get) + +#endif /* GL_QCOM_extended_get */ + +/* ------------------------- GL_QCOM_extended_get2 ------------------------- */ + +#ifndef GL_QCOM_extended_get2 +#define GL_QCOM_extended_get2 1 + +typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar* source, GLint* length); +typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint* programs, GLint maxPrograms, GLint* numPrograms); +typedef void (GLAPIENTRY * PFNGLEXTGETSHADERSQCOMPROC) (GLuint* shaders, GLint maxShaders, GLint* numShaders); +typedef GLboolean (GLAPIENTRY * PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); + +#define glExtGetProgramBinarySourceQCOM GLEW_GET_FUN(__glewExtGetProgramBinarySourceQCOM) +#define glExtGetProgramsQCOM GLEW_GET_FUN(__glewExtGetProgramsQCOM) +#define glExtGetShadersQCOM GLEW_GET_FUN(__glewExtGetShadersQCOM) +#define glExtIsProgramBinaryQCOM GLEW_GET_FUN(__glewExtIsProgramBinaryQCOM) + +#define GLEW_QCOM_extended_get2 GLEW_GET_VAR(__GLEW_QCOM_extended_get2) + +#endif /* GL_QCOM_extended_get2 */ + +/* ---------------------- GL_QCOM_framebuffer_foveated --------------------- */ + +#ifndef GL_QCOM_framebuffer_foveated +#define GL_QCOM_framebuffer_foveated 1 + +#define GL_FOVEATION_ENABLE_BIT_QCOM 0x1 +#define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x2 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC) (GLuint fbo, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint* providedFeatures); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC) (GLuint fbo, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); + +#define glFramebufferFoveationConfigQCOM GLEW_GET_FUN(__glewFramebufferFoveationConfigQCOM) +#define glFramebufferFoveationParametersQCOM GLEW_GET_FUN(__glewFramebufferFoveationParametersQCOM) + +#define GLEW_QCOM_framebuffer_foveated GLEW_GET_VAR(__GLEW_QCOM_framebuffer_foveated) + +#endif /* GL_QCOM_framebuffer_foveated */ + +/* ---------------------- GL_QCOM_perfmon_global_mode ---------------------- */ + +#ifndef GL_QCOM_perfmon_global_mode +#define GL_QCOM_perfmon_global_mode 1 + +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 + +#define GLEW_QCOM_perfmon_global_mode GLEW_GET_VAR(__GLEW_QCOM_perfmon_global_mode) + +#endif /* GL_QCOM_perfmon_global_mode */ + +/* -------------- GL_QCOM_shader_framebuffer_fetch_noncoherent ------------- */ + +#ifndef GL_QCOM_shader_framebuffer_fetch_noncoherent +#define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 + +#define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC) (void); + +#define glFramebufferFetchBarrierQCOM GLEW_GET_FUN(__glewFramebufferFetchBarrierQCOM) + +#define GLEW_QCOM_shader_framebuffer_fetch_noncoherent GLEW_GET_VAR(__GLEW_QCOM_shader_framebuffer_fetch_noncoherent) + +#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ + +/* ------------------------ GL_QCOM_tiled_rendering ------------------------ */ + +#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 (GLAPIENTRY * PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); +typedef void (GLAPIENTRY * PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); + +#define glEndTilingQCOM GLEW_GET_FUN(__glewEndTilingQCOM) +#define glStartTilingQCOM GLEW_GET_FUN(__glewStartTilingQCOM) + +#define GLEW_QCOM_tiled_rendering GLEW_GET_VAR(__GLEW_QCOM_tiled_rendering) + +#endif /* GL_QCOM_tiled_rendering */ + +/* ---------------------- GL_QCOM_writeonly_rendering ---------------------- */ + +#ifndef GL_QCOM_writeonly_rendering +#define GL_QCOM_writeonly_rendering 1 + +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 + +#define GLEW_QCOM_writeonly_rendering GLEW_GET_VAR(__GLEW_QCOM_writeonly_rendering) + +#endif /* GL_QCOM_writeonly_rendering */ + +/* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_0_compatibility +#define GL_REGAL_ES1_0_compatibility 1 + +typedef int GLclampx; + +typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); +typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); +typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); +typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); +typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); + +#define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) +#define glClearColorx GLEW_GET_FUN(__glewClearColorx) +#define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) +#define glColor4x GLEW_GET_FUN(__glewColor4x) +#define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) +#define glFogx GLEW_GET_FUN(__glewFogx) +#define glFogxv GLEW_GET_FUN(__glewFogxv) +#define glFrustumf GLEW_GET_FUN(__glewFrustumf) +#define glFrustumx GLEW_GET_FUN(__glewFrustumx) +#define glLightModelx GLEW_GET_FUN(__glewLightModelx) +#define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) +#define glLightx GLEW_GET_FUN(__glewLightx) +#define glLightxv GLEW_GET_FUN(__glewLightxv) +#define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) +#define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) +#define glMaterialx GLEW_GET_FUN(__glewMaterialx) +#define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) +#define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) +#define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) +#define glNormal3x GLEW_GET_FUN(__glewNormal3x) +#define glOrthof GLEW_GET_FUN(__glewOrthof) +#define glOrthox GLEW_GET_FUN(__glewOrthox) +#define glPointSizex GLEW_GET_FUN(__glewPointSizex) +#define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) +#define glRotatex GLEW_GET_FUN(__glewRotatex) +#define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) +#define glScalex GLEW_GET_FUN(__glewScalex) +#define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) +#define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) +#define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) +#define glTranslatex GLEW_GET_FUN(__glewTranslatex) + +#define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) + +#endif /* GL_REGAL_ES1_0_compatibility */ + +/* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_1_compatibility +#define GL_REGAL_ES1_1_compatibility 1 + +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); + +#define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) +#define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) +#define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) +#define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) +#define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) +#define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) +#define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) +#define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) +#define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) +#define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) +#define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) +#define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) +#define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) + +#define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) + +#endif /* GL_REGAL_ES1_1_compatibility */ + +/* ---------------------------- GL_REGAL_enable ---------------------------- */ + +#ifndef GL_REGAL_enable +#define GL_REGAL_enable 1 + +#define GL_ERROR_REGAL 0x9322 +#define GL_DEBUG_REGAL 0x9323 +#define GL_LOG_REGAL 0x9324 +#define GL_EMULATION_REGAL 0x9325 +#define GL_DRIVER_REGAL 0x9326 +#define GL_MISSING_REGAL 0x9360 +#define GL_TRACE_REGAL 0x9361 +#define GL_CACHE_REGAL 0x9362 +#define GL_CODE_REGAL 0x9363 +#define GL_STATISTICS_REGAL 0x9364 + +#define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) + +#endif /* GL_REGAL_enable */ + +/* ------------------------- GL_REGAL_error_string ------------------------- */ + +#ifndef GL_REGAL_error_string +#define GL_REGAL_error_string 1 + +typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error); + +#define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL) + +#define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string) + +#endif /* GL_REGAL_error_string */ + +/* ------------------------ GL_REGAL_extension_query ----------------------- */ + +#ifndef GL_REGAL_extension_query +#define GL_REGAL_extension_query 1 + +typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext); +typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); + +#define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL) +#define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL) + +#define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query) + +#endif /* GL_REGAL_extension_query */ + +/* ------------------------------ GL_REGAL_log ----------------------------- */ + +#ifndef GL_REGAL_log +#define GL_REGAL_log 1 + +#define GL_LOG_ERROR_REGAL 0x9319 +#define GL_LOG_WARNING_REGAL 0x931A +#define GL_LOG_INFO_REGAL 0x931B +#define GL_LOG_APP_REGAL 0x931C +#define GL_LOG_DRIVER_REGAL 0x931D +#define GL_LOG_INTERNAL_REGAL 0x931E +#define GL_LOG_DEBUG_REGAL 0x931F +#define GL_LOG_STATUS_REGAL 0x9320 +#define GL_LOG_HTTP_REGAL 0x9321 + +typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, void *context); + +typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); + +#define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) + +#define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) + +#endif /* GL_REGAL_log */ + +/* ------------------------- GL_REGAL_proc_address ------------------------- */ + +#ifndef GL_REGAL_proc_address +#define GL_REGAL_proc_address 1 + +typedef void * (GLAPIENTRY * PFNGLGETPROCADDRESSREGALPROC) (const GLchar *name); + +#define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) + +#define GLEW_REGAL_proc_address GLEW_GET_VAR(__GLEW_REGAL_proc_address) + +#endif /* GL_REGAL_proc_address */ + +/* ----------------------- 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_clip_band_hint ------------------------ */ + +#ifndef GL_SGIS_clip_band_hint +#define GL_SGIS_clip_band_hint 1 + +#define GLEW_SGIS_clip_band_hint GLEW_GET_VAR(__GLEW_SGIS_clip_band_hint) + +#endif /* GL_SGIS_clip_band_hint */ + +/* -------------------------- 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_line_texgen -------------------------- */ + +#ifndef GL_SGIS_line_texgen +#define GL_SGIS_line_texgen 1 + +#define GLEW_SGIS_line_texgen GLEW_GET_VAR(__GLEW_SGIS_line_texgen) + +#endif /* GL_SGIS_line_texgen */ + +/* -------------------------- 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 + +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_multitexture ------------------------- */ + +#ifndef GL_SGIS_multitexture +#define GL_SGIS_multitexture 1 + +#define GL_SELECTED_TEXTURE_SGIS 0x83C0 +#define GL_SELECTED_TEXTURE_COORD_SET_SGIS 0x83C1 +#define GL_SELECTED_TEXTURE_TRANSFORM_SGIS 0x83C2 +#define GL_MAX_TEXTURES_SGIS 0x83C3 +#define GL_MAX_TEXTURE_COORD_SETS_SGIS 0x83C4 +#define GL_TEXTURE_COORD_SET_INTERLEAVE_FACTOR_SGIS 0x83C5 +#define GL_TEXTURE_ENV_COORD_SET_SGIS 0x83C6 +#define GL_TEXTURE0_SGIS 0x83C7 +#define GL_TEXTURE1_SGIS 0x83C8 +#define GL_TEXTURE2_SGIS 0x83C9 +#define GL_TEXTURE3_SGIS 0x83CA + +typedef void (GLAPIENTRY * PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC) (GLint factor); +typedef void (GLAPIENTRY * PFNGLSELECTTEXTURECOORDSETSGISPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSELECTTEXTURESGISPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSELECTTEXTURETRANSFORMSGISPROC) (GLenum target); + +#define glInterleavedTextureCoordSetsSGIS GLEW_GET_FUN(__glewInterleavedTextureCoordSetsSGIS) +#define glSelectTextureCoordSetSGIS GLEW_GET_FUN(__glewSelectTextureCoordSetSGIS) +#define glSelectTextureSGIS GLEW_GET_FUN(__glewSelectTextureSGIS) +#define glSelectTextureTransformSGIS GLEW_GET_FUN(__glewSelectTextureTransformSGIS) + +#define GLEW_SGIS_multitexture GLEW_GET_VAR(__GLEW_SGIS_multitexture) + +#endif /* GL_SGIS_multitexture */ + +/* ------------------------- 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_shared_multisample ---------------------- */ + +#ifndef GL_SGIS_shared_multisample +#define GL_SGIS_shared_multisample 1 + +typedef void (GLAPIENTRY * PFNGLMULTISAMPLESUBRECTPOSSGISPROC) (GLint x, GLint y); + +#define glMultisampleSubRectPosSGIS GLEW_GET_FUN(__glewMultisampleSubRectPosSGIS) + +#define GLEW_SGIS_shared_multisample GLEW_GET_VAR(__GLEW_SGIS_shared_multisample) + +#endif /* GL_SGIS_shared_multisample */ + +/* ------------------------ 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_bali_g_instruments ---------------------- */ + +#ifndef GL_SGIX_bali_g_instruments +#define GL_SGIX_bali_g_instruments 1 + +#define GL_BALI_NUM_TRIS_CULLED_INSTRUMENT 0x6080 +#define GL_BALI_NUM_PRIMS_CLIPPED_INSTRUMENT 0x6081 +#define GL_BALI_NUM_PRIMS_REJECT_INSTRUMENT 0x6082 +#define GL_BALI_NUM_PRIMS_CLIP_RESULT_INSTRUMENT 0x6083 + +#define GLEW_SGIX_bali_g_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_g_instruments) + +#endif /* GL_SGIX_bali_g_instruments */ + +/* ----------------------- GL_SGIX_bali_r_instruments ---------------------- */ + +#ifndef GL_SGIX_bali_r_instruments +#define GL_SGIX_bali_r_instruments 1 + +#define GL_BALI_FRAGMENTS_GENERATED_INSTRUMENT 0x6090 +#define GL_BALI_DEPTH_PASS_INSTRUMENT 0x6091 +#define GL_BALI_R_CHIP_COUNT 0x6092 + +#define GLEW_SGIX_bali_r_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_r_instruments) + +#endif /* GL_SGIX_bali_r_instruments */ + +/* --------------------- GL_SGIX_bali_timer_instruments -------------------- */ + +#ifndef GL_SGIX_bali_timer_instruments +#define GL_SGIX_bali_timer_instruments 1 + +#define GLEW_SGIX_bali_timer_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_timer_instruments) + +#endif /* GL_SGIX_bali_timer_instruments */ + +/* ----------------------- 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_blend_cadd -------------------------- */ + +#ifndef GL_SGIX_blend_cadd +#define GL_SGIX_blend_cadd 1 + +#define GL_FUNC_COMPLEX_ADD_EXT 0x601C + +#define GLEW_SGIX_blend_cadd GLEW_GET_VAR(__GLEW_SGIX_blend_cadd) + +#endif /* GL_SGIX_blend_cadd */ + +/* ------------------------ GL_SGIX_blend_cmultiply ------------------------ */ + +#ifndef GL_SGIX_blend_cmultiply +#define GL_SGIX_blend_cmultiply 1 + +#define GL_FUNC_COMPLEX_MULTIPLY_EXT 0x601B + +#define GLEW_SGIX_blend_cmultiply GLEW_GET_VAR(__GLEW_SGIX_blend_cmultiply) + +#endif /* GL_SGIX_blend_cmultiply */ + +/* --------------------- GL_SGIX_calligraphic_fragment --------------------- */ + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 + +#define GLEW_SGIX_calligraphic_fragment GLEW_GET_VAR(__GLEW_SGIX_calligraphic_fragment) + +#endif /* GL_SGIX_calligraphic_fragment */ + +/* ---------------------------- 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_color_matrix_accuracy --------------------- */ + +#ifndef GL_SGIX_color_matrix_accuracy +#define GL_SGIX_color_matrix_accuracy 1 + +#define GL_COLOR_MATRIX_HINT 0x8317 + +#define GLEW_SGIX_color_matrix_accuracy GLEW_GET_VAR(__GLEW_SGIX_color_matrix_accuracy) + +#endif /* GL_SGIX_color_matrix_accuracy */ + +/* --------------------- GL_SGIX_color_table_index_mode -------------------- */ + +#ifndef GL_SGIX_color_table_index_mode +#define GL_SGIX_color_table_index_mode 1 + +#define GLEW_SGIX_color_table_index_mode GLEW_GET_VAR(__GLEW_SGIX_color_table_index_mode) + +#endif /* GL_SGIX_color_table_index_mode */ + +/* ------------------------- GL_SGIX_complex_polar ------------------------- */ + +#ifndef GL_SGIX_complex_polar +#define GL_SGIX_complex_polar 1 + +#define GLEW_SGIX_complex_polar GLEW_GET_VAR(__GLEW_SGIX_complex_polar) + +#endif /* GL_SGIX_complex_polar */ + +/* ---------------------- 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_cube_map --------------------------- */ + +#ifndef GL_SGIX_cube_map +#define GL_SGIX_cube_map 1 + +#define GL_ENV_MAP_SGIX 0x8340 +#define GL_CUBE_MAP_SGIX 0x8341 +#define GL_CUBE_MAP_ZP_SGIX 0x8342 +#define GL_CUBE_MAP_ZN_SGIX 0x8343 +#define GL_CUBE_MAP_XN_SGIX 0x8344 +#define GL_CUBE_MAP_XP_SGIX 0x8345 +#define GL_CUBE_MAP_YN_SGIX 0x8346 +#define GL_CUBE_MAP_YP_SGIX 0x8347 +#define GL_CUBE_MAP_BINDING_SGIX 0x8348 + +#define GLEW_SGIX_cube_map GLEW_GET_VAR(__GLEW_SGIX_cube_map) + +#endif /* GL_SGIX_cube_map */ + +/* ------------------------ GL_SGIX_cylinder_texgen ------------------------ */ + +#ifndef GL_SGIX_cylinder_texgen +#define GL_SGIX_cylinder_texgen 1 + +#define GLEW_SGIX_cylinder_texgen GLEW_GET_VAR(__GLEW_SGIX_cylinder_texgen) + +#endif /* GL_SGIX_cylinder_texgen */ + +/* ---------------------------- GL_SGIX_datapipe --------------------------- */ + +#ifndef GL_SGIX_datapipe +#define GL_SGIX_datapipe 1 + +#define GL_GEOMETRY_BIT 0x1 +#define GL_IMAGE_BIT 0x2 + +typedef void (GLAPIENTRY * PFNGLADDRESSSPACEPROC) (GLenum space, GLbitfield mask); +typedef GLint (GLAPIENTRY * PFNGLDATAPIPEPROC) (GLenum space); + +#define glAddressSpace GLEW_GET_FUN(__glewAddressSpace) +#define glDataPipe GLEW_GET_FUN(__glewDataPipe) + +#define GLEW_SGIX_datapipe GLEW_GET_VAR(__GLEW_SGIX_datapipe) + +#endif /* GL_SGIX_datapipe */ + +/* --------------------------- GL_SGIX_decimation -------------------------- */ + +#ifndef GL_SGIX_decimation +#define GL_SGIX_decimation 1 + +#define GLEW_SGIX_decimation GLEW_GET_VAR(__GLEW_SGIX_decimation) + +#endif /* GL_SGIX_decimation */ + +/* --------------------- GL_SGIX_depth_pass_instrument --------------------- */ + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 + +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 + +#define GLEW_SGIX_depth_pass_instrument GLEW_GET_VAR(__GLEW_SGIX_depth_pass_instrument) + +#endif /* GL_SGIX_depth_pass_instrument */ + +/* ------------------------- 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_dvc ------------------------------ */ + +#ifndef GL_SGIX_dvc +#define GL_SGIX_dvc 1 + +#define GLEW_SGIX_dvc GLEW_GET_VAR(__GLEW_SGIX_dvc) + +#endif /* GL_SGIX_dvc */ + +/* -------------------------- 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_blend --------------------------- */ + +#ifndef GL_SGIX_fog_blend +#define GL_SGIX_fog_blend 1 + +#define GL_FOG_BLEND_ALPHA_SGIX 0x81FE +#define GL_FOG_BLEND_COLOR_SGIX 0x81FF + +#define GLEW_SGIX_fog_blend GLEW_GET_VAR(__GLEW_SGIX_fog_blend) + +#endif /* GL_SGIX_fog_blend */ + +/* ---------------------- GL_SGIX_fog_factor_to_alpha ---------------------- */ + +#ifndef GL_SGIX_fog_factor_to_alpha +#define GL_SGIX_fog_factor_to_alpha 1 + +#define GLEW_SGIX_fog_factor_to_alpha GLEW_GET_VAR(__GLEW_SGIX_fog_factor_to_alpha) + +#endif /* GL_SGIX_fog_factor_to_alpha */ + +/* --------------------------- GL_SGIX_fog_layers -------------------------- */ + +#ifndef GL_SGIX_fog_layers +#define GL_SGIX_fog_layers 1 + +#define GL_FOG_TYPE_SGIX 0x8323 +#define GL_UNIFORM_SGIX 0x8324 +#define GL_LAYERED_SGIX 0x8325 +#define GL_FOG_GROUND_PLANE_SGIX 0x8326 +#define GL_FOG_LAYERS_POINTS_SGIX 0x8327 +#define GL_MAX_FOG_LAYERS_POINTS_SGIX 0x8328 + +typedef void (GLAPIENTRY * PFNGLFOGLAYERSSGIXPROC) (GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETFOGLAYERSSGIXPROC) (GLfloat* points); + +#define glFogLayersSGIX GLEW_GET_FUN(__glewFogLayersSGIX) +#define glGetFogLayersSGIX GLEW_GET_FUN(__glewGetFogLayersSGIX) + +#define GLEW_SGIX_fog_layers GLEW_GET_VAR(__GLEW_SGIX_fog_layers) + +#endif /* GL_SGIX_fog_layers */ + +/* --------------------------- 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_patchy -------------------------- */ + +#ifndef GL_SGIX_fog_patchy +#define GL_SGIX_fog_patchy 1 + +#define GLEW_SGIX_fog_patchy GLEW_GET_VAR(__GLEW_SGIX_fog_patchy) + +#endif /* GL_SGIX_fog_patchy */ + +/* --------------------------- GL_SGIX_fog_scale --------------------------- */ + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 + +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD + +#define GLEW_SGIX_fog_scale GLEW_GET_VAR(__GLEW_SGIX_fog_scale) + +#endif /* GL_SGIX_fog_scale */ + +/* -------------------------- GL_SGIX_fog_texture -------------------------- */ + +#ifndef GL_SGIX_fog_texture +#define GL_SGIX_fog_texture 1 + +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_lighting_space -------------------- */ + +#ifndef GL_SGIX_fragment_lighting_space +#define GL_SGIX_fragment_lighting_space 1 + +#define GL_EYE_SPACE_SGIX 0x8436 +#define GL_TANGENT_SPACE_SGIX 0x8437 +#define GL_OBJECT_SPACE_SGIX 0x8438 +#define GL_FRAGMENT_LIGHT_SPACE_SGIX 0x843D + +#define GLEW_SGIX_fragment_lighting_space GLEW_GET_VAR(__GLEW_SGIX_fragment_lighting_space) + +#endif /* GL_SGIX_fragment_lighting_space */ + +/* ------------------- 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_fragments_instrument --------------------- */ + +#ifndef GL_SGIX_fragments_instrument +#define GL_SGIX_fragments_instrument 1 + +#define GL_FRAGMENTS_INSTRUMENT_SGIX 0x8313 +#define GL_FRAGMENTS_INSTRUMENT_COUNTERS_SGIX 0x8314 +#define GL_FRAGMENTS_INSTRUMENT_MAX_SGIX 0x8315 + +#define GLEW_SGIX_fragments_instrument GLEW_GET_VAR(__GLEW_SGIX_fragments_instrument) + +#endif /* GL_SGIX_fragments_instrument */ + +/* --------------------------- 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_icc_texture -------------------------- */ + +#ifndef GL_SGIX_icc_texture +#define GL_SGIX_icc_texture 1 + +#define GL_RGB_ICC_SGIX 0x8460 +#define GL_RGBA_ICC_SGIX 0x8461 +#define GL_ALPHA_ICC_SGIX 0x8462 +#define GL_LUMINANCE_ICC_SGIX 0x8463 +#define GL_INTENSITY_ICC_SGIX 0x8464 +#define GL_LUMINANCE_ALPHA_ICC_SGIX 0x8465 +#define GL_R5_G6_B5_ICC_SGIX 0x8466 +#define GL_R5_G6_B5_A8_ICC_SGIX 0x8467 +#define GL_ALPHA16_ICC_SGIX 0x8468 +#define GL_LUMINANCE16_ICC_SGIX 0x8469 +#define GL_INTENSITY16_ICC_SGIX 0x846A +#define GL_LUMINANCE16_ALPHA8_ICC_SGIX 0x846B + +#define GLEW_SGIX_icc_texture GLEW_GET_VAR(__GLEW_SGIX_icc_texture) + +#endif /* GL_SGIX_icc_texture */ + +/* ------------------------ GL_SGIX_igloo_interface ------------------------ */ + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 + +#define GL_IGLOO_FULLSCREEN_SGIX 0x819E +#define GL_IGLOO_VIEWPORT_OFFSET_SGIX 0x819F +#define GL_IGLOO_SWAPTMESH_SGIX 0x81A0 +#define GL_IGLOO_COLORNORMAL_SGIX 0x81A1 +#define GL_IGLOO_IRISGL_MODE_SGIX 0x81A2 +#define GL_IGLOO_LMC_COLOR_SGIX 0x81A3 +#define GL_IGLOO_TMESHMODE_SGIX 0x81A4 +#define GL_LIGHT31 0xBEAD + +typedef void (GLAPIENTRY * PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, void *param); + +#define glIglooInterfaceSGIX GLEW_GET_FUN(__glewIglooInterfaceSGIX) + +#define GLEW_SGIX_igloo_interface GLEW_GET_VAR(__GLEW_SGIX_igloo_interface) + +#endif /* GL_SGIX_igloo_interface */ + +/* ----------------------- GL_SGIX_image_compression ----------------------- */ + +#ifndef GL_SGIX_image_compression +#define GL_SGIX_image_compression 1 + +#define GLEW_SGIX_image_compression GLEW_GET_VAR(__GLEW_SGIX_image_compression) + +#endif /* GL_SGIX_image_compression */ + +/* ---------------------- GL_SGIX_impact_pixel_texture --------------------- */ + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_SGIX_impact_pixel_texture 1 + +#define GLEW_SGIX_impact_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_impact_pixel_texture) + +#endif /* GL_SGIX_impact_pixel_texture */ + +/* ------------------------ GL_SGIX_instrument_error ----------------------- */ + +#ifndef GL_SGIX_instrument_error +#define GL_SGIX_instrument_error 1 + +#define GLEW_SGIX_instrument_error GLEW_GET_VAR(__GLEW_SGIX_instrument_error) + +#endif /* GL_SGIX_instrument_error */ + +/* --------------------------- 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_line_quality_hint ----------------------- */ + +#ifndef GL_SGIX_line_quality_hint +#define GL_SGIX_line_quality_hint 1 + +#define GL_LINE_QUALITY_HINT_SGIX 0x835B + +#define GLEW_SGIX_line_quality_hint GLEW_GET_VAR(__GLEW_SGIX_line_quality_hint) + +#endif /* GL_SGIX_line_quality_hint */ + +/* ------------------------- 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_mpeg1 ----------------------------- */ + +#ifndef GL_SGIX_mpeg1 +#define GL_SGIX_mpeg1 1 + +typedef void (GLAPIENTRY * PFNGLALLOCMPEGPREDICTORSSGIXPROC) (GLsizei width, GLsizei height, GLsizei n, GLuint* predictors); +typedef void (GLAPIENTRY * PFNGLDELETEMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); +typedef void (GLAPIENTRY * PFNGLGENMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); +typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERFVSGIXPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERIVSGIXPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); +typedef GLboolean (GLAPIENTRY * PFNGLISMPEGPREDICTORSGIXPROC) (GLuint predictor); +typedef void (GLAPIENTRY * PFNGLMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); +typedef void (GLAPIENTRY * PFNGLSWAPMPEGPREDICTORSSGIXPROC) (GLenum target0, GLenum target1); + +#define glAllocMPEGPredictorsSGIX GLEW_GET_FUN(__glewAllocMPEGPredictorsSGIX) +#define glDeleteMPEGPredictorsSGIX GLEW_GET_FUN(__glewDeleteMPEGPredictorsSGIX) +#define glGenMPEGPredictorsSGIX GLEW_GET_FUN(__glewGenMPEGPredictorsSGIX) +#define glGetMPEGParameterfvSGIX GLEW_GET_FUN(__glewGetMPEGParameterfvSGIX) +#define glGetMPEGParameterivSGIX GLEW_GET_FUN(__glewGetMPEGParameterivSGIX) +#define glGetMPEGPredictorSGIX GLEW_GET_FUN(__glewGetMPEGPredictorSGIX) +#define glGetMPEGQuantTableubv GLEW_GET_FUN(__glewGetMPEGQuantTableubv) +#define glIsMPEGPredictorSGIX GLEW_GET_FUN(__glewIsMPEGPredictorSGIX) +#define glMPEGPredictorSGIX GLEW_GET_FUN(__glewMPEGPredictorSGIX) +#define glMPEGQuantTableubv GLEW_GET_FUN(__glewMPEGQuantTableubv) +#define glSwapMPEGPredictorsSGIX GLEW_GET_FUN(__glewSwapMPEGPredictorsSGIX) + +#define GLEW_SGIX_mpeg1 GLEW_GET_VAR(__GLEW_SGIX_mpeg1) + +#endif /* GL_SGIX_mpeg1 */ + +/* ----------------------------- GL_SGIX_mpeg2 ----------------------------- */ + +#ifndef GL_SGIX_mpeg2 +#define GL_SGIX_mpeg2 1 + +#define GLEW_SGIX_mpeg2 GLEW_GET_VAR(__GLEW_SGIX_mpeg2) + +#endif /* GL_SGIX_mpeg2 */ + +/* ------------------ GL_SGIX_nonlinear_lighting_pervertex ----------------- */ + +#ifndef GL_SGIX_nonlinear_lighting_pervertex +#define GL_SGIX_nonlinear_lighting_pervertex 1 + +typedef void (GLAPIENTRY * PFNGLGETNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint* terms, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint* terms, const GLfloat *data); +typedef void (GLAPIENTRY * PFNGLNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint terms, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint terms, const GLfloat* params); + +#define glGetNonlinLightfvSGIX GLEW_GET_FUN(__glewGetNonlinLightfvSGIX) +#define glGetNonlinMaterialfvSGIX GLEW_GET_FUN(__glewGetNonlinMaterialfvSGIX) +#define glNonlinLightfvSGIX GLEW_GET_FUN(__glewNonlinLightfvSGIX) +#define glNonlinMaterialfvSGIX GLEW_GET_FUN(__glewNonlinMaterialfvSGIX) + +#define GLEW_SGIX_nonlinear_lighting_pervertex GLEW_GET_VAR(__GLEW_SGIX_nonlinear_lighting_pervertex) + +#endif /* GL_SGIX_nonlinear_lighting_pervertex */ + +/* --------------------------- GL_SGIX_nurbs_eval -------------------------- */ + +#ifndef GL_SGIX_nurbs_eval +#define GL_SGIX_nurbs_eval 1 + +#define GL_MAP1_VERTEX_3_NURBS_SGIX 0x81CB +#define GL_MAP1_VERTEX_4_NURBS_SGIX 0x81CC +#define GL_MAP1_INDEX_NURBS_SGIX 0x81CD +#define GL_MAP1_COLOR_4_NURBS_SGIX 0x81CE +#define GL_MAP1_NORMAL_NURBS_SGIX 0x81CF +#define GL_MAP1_TEXTURE_COORD_1_NURBS_SGIX 0x81E0 +#define GL_MAP1_TEXTURE_COORD_2_NURBS_SGIX 0x81E1 +#define GL_MAP1_TEXTURE_COORD_3_NURBS_SGIX 0x81E2 +#define GL_MAP1_TEXTURE_COORD_4_NURBS_SGIX 0x81E3 +#define GL_MAP2_VERTEX_3_NURBS_SGIX 0x81E4 +#define GL_MAP2_VERTEX_4_NURBS_SGIX 0x81E5 +#define GL_MAP2_INDEX_NURBS_SGIX 0x81E6 +#define GL_MAP2_COLOR_4_NURBS_SGIX 0x81E7 +#define GL_MAP2_NORMAL_NURBS_SGIX 0x81E8 +#define GL_MAP2_TEXTURE_COORD_1_NURBS_SGIX 0x81E9 +#define GL_MAP2_TEXTURE_COORD_2_NURBS_SGIX 0x81EA +#define GL_MAP2_TEXTURE_COORD_3_NURBS_SGIX 0x81EB +#define GL_MAP2_TEXTURE_COORD_4_NURBS_SGIX 0x81EC +#define GL_NURBS_KNOT_COUNT_SGIX 0x81ED +#define GL_NURBS_KNOT_VECTOR_SGIX 0x81EE + +#define GLEW_SGIX_nurbs_eval GLEW_GET_VAR(__GLEW_SGIX_nurbs_eval) + +#endif /* GL_SGIX_nurbs_eval */ + +/* ---------------------- GL_SGIX_occlusion_instrument --------------------- */ + +#ifndef GL_SGIX_occlusion_instrument +#define GL_SGIX_occlusion_instrument 1 + +#define GL_OCCLUSION_INSTRUMENT_SGIX 0x6060 + +#define GLEW_SGIX_occlusion_instrument GLEW_GET_VAR(__GLEW_SGIX_occlusion_instrument) + +#endif /* GL_SGIX_occlusion_instrument */ + +/* ------------------------- GL_SGIX_packed_6bytes ------------------------- */ + +#ifndef GL_SGIX_packed_6bytes +#define GL_SGIX_packed_6bytes 1 + +#define GLEW_SGIX_packed_6bytes GLEW_GET_VAR(__GLEW_SGIX_packed_6bytes) + +#endif /* GL_SGIX_packed_6bytes */ + +/* ------------------------- 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_pixel_texture_lod ----------------------- */ + +#ifndef GL_SGIX_pixel_texture_lod +#define GL_SGIX_pixel_texture_lod 1 + +#define GLEW_SGIX_pixel_texture_lod GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_lod) + +#endif /* GL_SGIX_pixel_texture_lod */ + +/* -------------------------- GL_SGIX_pixel_tiles -------------------------- */ + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 + +#define GLEW_SGIX_pixel_tiles GLEW_GET_VAR(__GLEW_SGIX_pixel_tiles) + +#endif /* GL_SGIX_pixel_tiles */ + +/* ------------------------- GL_SGIX_polynomial_ffd ------------------------ */ + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 + +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x1 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x2 + +typedef void (GLAPIENTRY * PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); + +#define glDeformSGIX GLEW_GET_FUN(__glewDeformSGIX) +#define glLoadIdentityDeformationMapSGIX GLEW_GET_FUN(__glewLoadIdentityDeformationMapSGIX) + +#define GLEW_SGIX_polynomial_ffd GLEW_GET_VAR(__GLEW_SGIX_polynomial_ffd) + +#endif /* GL_SGIX_polynomial_ffd */ + +/* --------------------------- GL_SGIX_quad_mesh --------------------------- */ + +#ifndef GL_SGIX_quad_mesh +#define GL_SGIX_quad_mesh 1 + +typedef void (GLAPIENTRY * PFNGLMESHBREADTHSGIXPROC) (GLint breadth); +typedef void (GLAPIENTRY * PFNGLMESHSTRIDESGIXPROC) (GLint stride); + +#define glMeshBreadthSGIX GLEW_GET_FUN(__glewMeshBreadthSGIX) +#define glMeshStrideSGIX GLEW_GET_FUN(__glewMeshStrideSGIX) + +#define GLEW_SGIX_quad_mesh GLEW_GET_VAR(__GLEW_SGIX_quad_mesh) + +#endif /* GL_SGIX_quad_mesh */ + +/* ------------------------ 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_scalebias_hint ------------------------ */ + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 + +#define GL_SCALEBIAS_HINT_SGIX 0x8322 + +#define GLEW_SGIX_scalebias_hint GLEW_GET_VAR(__GLEW_SGIX_scalebias_hint) + +#endif /* GL_SGIX_scalebias_hint */ + +/* ----------------------------- 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_slim ----------------------------- */ + +#ifndef GL_SGIX_slim +#define GL_SGIX_slim 1 + +#define GL_PACK_MAX_COMPRESSED_SIZE_SGIX 0x831B +#define GL_SLIM8U_SGIX 0x831D +#define GL_SLIM10U_SGIX 0x831E +#define GL_SLIM12S_SGIX 0x831F + +#define GLEW_SGIX_slim GLEW_GET_VAR(__GLEW_SGIX_slim) + +#endif /* GL_SGIX_slim */ + +/* ------------------------ GL_SGIX_spotlight_cutoff ----------------------- */ + +#ifndef GL_SGIX_spotlight_cutoff +#define GL_SGIX_spotlight_cutoff 1 + +#define GL_SPOT_CUTOFF_DELTA_SGIX 0x8193 + +#define GLEW_SGIX_spotlight_cutoff GLEW_GET_VAR(__GLEW_SGIX_spotlight_cutoff) + +#endif /* GL_SGIX_spotlight_cutoff */ + +/* ----------------------------- 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_subdiv_patch ------------------------- */ + +#ifndef GL_SGIX_subdiv_patch +#define GL_SGIX_subdiv_patch 1 + +#define GLEW_SGIX_subdiv_patch GLEW_GET_VAR(__GLEW_SGIX_subdiv_patch) + +#endif /* GL_SGIX_subdiv_patch */ + +/* --------------------------- GL_SGIX_subsample --------------------------- */ + +#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 + +#define GLEW_SGIX_subsample GLEW_GET_VAR(__GLEW_SGIX_subsample) + +#endif /* GL_SGIX_subsample */ + +/* ----------------------- 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_mipmap_anisotropic ------------------ */ + +#ifndef GL_SGIX_texture_mipmap_anisotropic +#define GL_SGIX_texture_mipmap_anisotropic 1 + +#define GL_TEXTURE_MIPMAP_ANISOTROPY_SGIX 0x832E +#define GL_MAX_MIPMAP_ANISOTROPY_SGIX 0x832F + +#define GLEW_SGIX_texture_mipmap_anisotropic GLEW_GET_VAR(__GLEW_SGIX_texture_mipmap_anisotropic) + +#endif /* GL_SGIX_texture_mipmap_anisotropic */ + +/* ---------------------- 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_phase ------------------------- */ + +#ifndef GL_SGIX_texture_phase +#define GL_SGIX_texture_phase 1 + +#define GL_PHASE_SGIX 0x832A + +#define GLEW_SGIX_texture_phase GLEW_GET_VAR(__GLEW_SGIX_texture_phase) + +#endif /* GL_SGIX_texture_phase */ + +/* ------------------------- 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_texture_supersample ---------------------- */ + +#ifndef GL_SGIX_texture_supersample +#define GL_SGIX_texture_supersample 1 + +#define GLEW_SGIX_texture_supersample GLEW_GET_VAR(__GLEW_SGIX_texture_supersample) + +#endif /* GL_SGIX_texture_supersample */ + +/* --------------------------- GL_SGIX_vector_ops -------------------------- */ + +#ifndef GL_SGIX_vector_ops +#define GL_SGIX_vector_ops 1 + +typedef void (GLAPIENTRY * PFNGLGETVECTOROPERATIONSGIXPROC) (GLenum operation); +typedef void (GLAPIENTRY * PFNGLVECTOROPERATIONSGIXPROC) (GLenum operation); + +#define glGetVectorOperationSGIX GLEW_GET_FUN(__glewGetVectorOperationSGIX) +#define glVectorOperationSGIX GLEW_GET_FUN(__glewVectorOperationSGIX) + +#define GLEW_SGIX_vector_ops GLEW_GET_VAR(__GLEW_SGIX_vector_ops) + +#endif /* GL_SGIX_vector_ops */ + +/* ---------------------- GL_SGIX_vertex_array_object ---------------------- */ + +#ifndef GL_SGIX_vertex_array_object +#define GL_SGIX_vertex_array_object 1 + +typedef GLboolean (GLAPIENTRY * PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC) (GLsizei n, const GLuint* arrays, GLboolean* residences); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYSGIXPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSSGIXPROC) (GLsizei n, GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYSGIXPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays, const GLclampf* priorities); + +#define glAreVertexArraysResidentSGIX GLEW_GET_FUN(__glewAreVertexArraysResidentSGIX) +#define glBindVertexArraySGIX GLEW_GET_FUN(__glewBindVertexArraySGIX) +#define glDeleteVertexArraysSGIX GLEW_GET_FUN(__glewDeleteVertexArraysSGIX) +#define glGenVertexArraysSGIX GLEW_GET_FUN(__glewGenVertexArraysSGIX) +#define glIsVertexArraySGIX GLEW_GET_FUN(__glewIsVertexArraySGIX) +#define glPrioritizeVertexArraysSGIX GLEW_GET_FUN(__glewPrioritizeVertexArraysSGIX) + +#define GLEW_SGIX_vertex_array_object GLEW_GET_VAR(__GLEW_SGIX_vertex_array_object) + +#endif /* GL_SGIX_vertex_array_object */ + +/* ------------------------- 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_SGIX_ycrcb_subsample ------------------------ */ + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 + +#define GLEW_SGIX_ycrcb_subsample GLEW_GET_VAR(__GLEW_SGIX_ycrcb_subsample) + +#endif /* GL_SGIX_ycrcb_subsample */ + +/* ----------------------------- GL_SGIX_ycrcba ---------------------------- */ + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 + +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 + +#define GLEW_SGIX_ycrcba GLEW_GET_VAR(__GLEW_SGIX_ycrcba) + +#endif /* GL_SGIX_ycrcba */ + +/* -------------------------- 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_complex ---------------------------- */ + +#ifndef GL_SGI_complex +#define GL_SGI_complex 1 + +#define GLEW_SGI_complex GLEW_GET_VAR(__GLEW_SGI_complex) + +#endif /* GL_SGI_complex */ + +/* -------------------------- GL_SGI_complex_type -------------------------- */ + +#ifndef GL_SGI_complex_type +#define GL_SGI_complex_type 1 + +#define GL_COMPLEX_UNSIGNED_BYTE_SGI 0x81BD +#define GL_COMPLEX_BYTE_SGI 0x81BE +#define GL_COMPLEX_UNSIGNED_SHORT_SGI 0x81BF +#define GL_COMPLEX_SHORT_SGI 0x81C0 +#define GL_COMPLEX_UNSIGNED_INT_SGI 0x81C1 +#define GL_COMPLEX_INT_SGI 0x81C2 +#define GL_COMPLEX_FLOAT_SGI 0x81C3 + +#define GLEW_SGI_complex_type GLEW_GET_VAR(__GLEW_SGI_complex_type) + +#endif /* GL_SGI_complex_type */ + +/* ------------------------------- GL_SGI_fft ------------------------------ */ + +#ifndef GL_SGI_fft +#define GL_SGI_fft 1 + +#define GL_PIXEL_TRANSFORM_OPERATOR_SGI 0x81C4 +#define GL_CONVOLUTION_SGI 0x81C5 +#define GL_FFT_1D_SGI 0x81C6 +#define GL_PIXEL_TRANSFORM_SGI 0x81C7 +#define GL_MAX_FFT_WIDTH_SGI 0x81C8 + +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFSGIPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERISGIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMSGIPROC) (GLenum target); + +#define glGetPixelTransformParameterfvSGI GLEW_GET_FUN(__glewGetPixelTransformParameterfvSGI) +#define glGetPixelTransformParameterivSGI GLEW_GET_FUN(__glewGetPixelTransformParameterivSGI) +#define glPixelTransformParameterfSGI GLEW_GET_FUN(__glewPixelTransformParameterfSGI) +#define glPixelTransformParameterfvSGI GLEW_GET_FUN(__glewPixelTransformParameterfvSGI) +#define glPixelTransformParameteriSGI GLEW_GET_FUN(__glewPixelTransformParameteriSGI) +#define glPixelTransformParameterivSGI GLEW_GET_FUN(__glewPixelTransformParameterivSGI) +#define glPixelTransformSGI GLEW_GET_FUN(__glewPixelTransformSGI) + +#define GLEW_SGI_fft GLEW_GET_VAR(__GLEW_SGI_fft) + +#endif /* GL_SGI_fft */ + +/* ----------------------- 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, void* 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_scene_markerXXX ------------------------ */ + +#ifndef GL_WIN_scene_markerXXX +#define GL_WIN_scene_markerXXX 1 + +#define GLEW_WIN_scene_markerXXX GLEW_GET_VAR(__GLEW_WIN_scene_markerXXX) + +#endif /* GL_WIN_scene_markerXXX */ + +/* -------------------------- 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 */ + +/* ------------------------------------------------------------------------- */ + + + +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 PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus; +GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage; +GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEPROC __glewGetnTexImage; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __glewMultiDrawArraysIndirectCount; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __glewMultiDrawElementsIndirectCount; +GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERPROC __glewSpecializeShader; + +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 PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewFramebufferSamplePositionsfvAMD; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC __glewGetFramebufferParameterfvAMD; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC __glewGetNamedFramebufferParameterfvAMD; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewNamedFramebufferSamplePositionsfvAMD; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; + +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 PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD; + +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 PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; + +GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; + +GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; +GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; +GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; +GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; +GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; +GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; + +GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; + +GLEW_FUN_EXPORT PFNGLCOPYTEXTURELEVELSAPPLEPROC __glewCopyTextureLevelsAPPLE; + +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 PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC __glewRenderbufferStorageMultisampleAPPLE; +GLEW_FUN_EXPORT PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC __glewResolveMultisampleFramebufferAPPLE; + +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; +GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; +GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; + +GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCAPPLEPROC __glewClientWaitSyncAPPLE; +GLEW_FUN_EXPORT PFNGLDELETESYNCAPPLEPROC __glewDeleteSyncAPPLE; +GLEW_FUN_EXPORT PFNGLFENCESYNCAPPLEPROC __glewFenceSyncAPPLE; +GLEW_FUN_EXPORT PFNGLGETINTEGER64VAPPLEPROC __glewGetInteger64vAPPLE; +GLEW_FUN_EXPORT PFNGLGETSYNCIVAPPLEPROC __glewGetSyncivAPPLE; +GLEW_FUN_EXPORT PFNGLISSYNCAPPLEPROC __glewIsSyncAPPLE; +GLEW_FUN_EXPORT PFNGLWAITSYNCAPPLEPROC __glewWaitSyncAPPLE; + +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 PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion; + +GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; + +GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; +GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; +GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; + +GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; + +GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; + +GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; +GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; + +GLEW_FUN_EXPORT PFNGLCLIPCONTROLPROC __glewClipControl; + +GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; + +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; + +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; + +GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; + +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit; +GLEW_FUN_EXPORT PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer; +GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLCREATEBUFFERSPROC __glewCreateBuffers; +GLEW_FUN_EXPORT PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines; +GLEW_FUN_EXPORT PFNGLCREATEQUERIESPROC __glewCreateQueries; +GLEW_FUN_EXPORT PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers; +GLEW_FUN_EXPORT PFNGLCREATESAMPLERSPROC __glewCreateSamplers; +GLEW_FUN_EXPORT PFNGLCREATETEXTURESPROC __glewCreateTextures; +GLEW_FUN_EXPORT PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange; +GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv; +GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData; +GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERPROC __glewTextureBuffer; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange; +GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers; + +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 PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT; + +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 PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage; +GLEW_FUN_EXPORT PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage; + +GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERARBPROC __glewSpecializeShaderARB; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; +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 PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB; + +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 PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v; + +GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData; +GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData; +GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer; +GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer; +GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage; +GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage; + +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 PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; +GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; +GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; +GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; +GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; + +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 PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPPROC __glewPolygonOffsetClamp; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv; + +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 PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB; + +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 PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding; + +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 PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB; + +GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; + +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 PFNGLTEXTUREBARRIERPROC __glewTextureBarrier; + +GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; + +GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT; + +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 PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView; + +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 PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat; +GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor; + +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 PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI; +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 PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __glewDrawArraysInstancedBaseInstanceEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseInstanceEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseVertexBaseInstanceEXT; + +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 PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __glewBindFragDataLocationIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXEXTPROC __glewGetFragDataIndexEXT; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __glewGetProgramResourceLocationIndexEXT; + +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTPROC __glewBufferStorageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEEXTPROC __glewClearTexImageEXT; +GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEEXTPROC __glewClearTexSubImageEXT; + +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 PFNGLCOPYIMAGESUBDATAEXTPROC __glewCopyImageSubDataEXT; + +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 PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT; +GLEW_FUN_EXPORT PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT; + +GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT; +GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT; +GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT; + +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 PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; + +GLEW_FUN_EXPORT PFNGLDISCARDFRAMEBUFFEREXTPROC __glewDiscardFramebufferEXT; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSEXTPROC __glewDrawBuffersEXT; + +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 PFNGLBLENDEQUATIONSEPARATEIEXTPROC __glewBlendEquationSeparateiEXT; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIEXTPROC __glewBlendEquationiEXT; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIEXTPROC __glewBlendFuncSeparateiEXT; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIEXTPROC __glewBlendFunciEXT; +GLEW_FUN_EXPORT PFNGLCOLORMASKIEXTPROC __glewColorMaskiEXT; +GLEW_FUN_EXPORT PFNGLDISABLEIEXTPROC __glewDisableiEXT; +GLEW_FUN_EXPORT PFNGLENABLEIEXTPROC __glewEnableiEXT; +GLEW_FUN_EXPORT PFNGLISENABLEDIEXTPROC __glewIsEnablediEXT; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXEXTPROC __glewDrawElementsBaseVertexEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __glewDrawElementsInstancedBaseVertexEXT; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __glewDrawRangeElementsBaseVertexEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __glewMultiDrawElementsBaseVertexEXT; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTERNALEXTPROC __glewBufferStorageExternalEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC __glewNamedBufferStorageExternalEXT; + +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 PFNGLVERTEXATTRIBDIVISOREXTPROC __glewVertexAttribDivisorEXT; + +GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; +GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; + +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC __glewFlushMappedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEEXTPROC __glewMapBufferRangeEXT; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEMEMEXTPROC __glewBufferStorageMemEXT; +GLEW_FUN_EXPORT PFNGLCREATEMEMORYOBJECTSEXTPROC __glewCreateMemoryObjectsEXT; +GLEW_FUN_EXPORT PFNGLDELETEMEMORYOBJECTSEXTPROC __glewDeleteMemoryObjectsEXT; +GLEW_FUN_EXPORT PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC __glewGetMemoryObjectParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEI_VEXTPROC __glewGetUnsignedBytei_vEXT; +GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEVEXTPROC __glewGetUnsignedBytevEXT; +GLEW_FUN_EXPORT PFNGLISMEMORYOBJECTEXTPROC __glewIsMemoryObjectEXT; +GLEW_FUN_EXPORT PFNGLMEMORYOBJECTPARAMETERIVEXTPROC __glewMemoryObjectParameterivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC __glewNamedBufferStorageMemEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM1DEXTPROC __glewTexStorageMem1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DEXTPROC __glewTexStorageMem2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC __glewTexStorageMem2DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DEXTPROC __glewTexStorageMem3DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC __glewTexStorageMem3DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM1DEXTPROC __glewTextureStorageMem1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DEXTPROC __glewTextureStorageMem2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC __glewTextureStorageMem2DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DEXTPROC __glewTextureStorageMem3DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC __glewTextureStorageMem3DMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTMEMORYFDEXTPROC __glewImportMemoryFdEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC __glewImportMemoryWin32HandleEXT; +GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32NAMEEXTPROC __glewImportMemoryWin32NameEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC __glewMultiDrawArraysIndirectEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC __glewMultiDrawElementsIndirectEXT; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __glewFramebufferTexture2DMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSINDEXEDEXTPROC __glewDrawBuffersIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETINTEGERI_VEXTPROC __glewGetIntegeri_vEXT; +GLEW_FUN_EXPORT PFNGLREADBUFFERINDEXEDEXTPROC __glewReadBufferIndexedEXT; + +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 PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT; + +GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; + +GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV; +GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV; +GLEW_FUN_EXPORT PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV; +GLEW_FUN_EXPORT PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT; + +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 PFNGLDELETESEMAPHORESEXTPROC __glewDeleteSemaphoresEXT; +GLEW_FUN_EXPORT PFNGLGENSEMAPHORESEXTPROC __glewGenSemaphoresEXT; +GLEW_FUN_EXPORT PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC __glewGetSemaphoreParameterui64vEXT; +GLEW_FUN_EXPORT PFNGLISSEMAPHOREEXTPROC __glewIsSemaphoreEXT; +GLEW_FUN_EXPORT PFNGLSEMAPHOREPARAMETERUI64VEXTPROC __glewSemaphoreParameterui64vEXT; +GLEW_FUN_EXPORT PFNGLSIGNALSEMAPHOREEXTPROC __glewSignalSemaphoreEXT; +GLEW_FUN_EXPORT PFNGLWAITSEMAPHOREEXTPROC __glewWaitSemaphoreEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREFDEXTPROC __glewImportSemaphoreFdEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC __glewImportSemaphoreWin32HandleEXT; +GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC __glewImportSemaphoreWin32NameEXT; + +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 PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC __glewClearPixelLocalStorageuiEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewFramebufferPixelLocalStorageSizeEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewGetFramebufferPixelLocalStorageSizeEXT; + +GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTEXTPROC __glewTexPageCommitmentEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; + +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 PFNGLTEXSTORAGE1DEXTPROC __glewTexStorage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DEXTPROC __glewTexStorage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DEXTPROC __glewTexStorage3DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXTUREVIEWEXTPROC __glewTextureViewEXT; + +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 PFNGLBINDARRAYSETEXTPROC __glewBindArraySetEXT; +GLEW_FUN_EXPORT PFNGLCREATEARRAYSETEXTPROC __glewCreateArraySetExt; +GLEW_FUN_EXPORT PFNGLDELETEARRAYSETSEXTPROC __glewDeleteArraySetsEXT; + +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 PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC __glewAcquireKeyedMutexWin32EXT; +GLEW_FUN_EXPORT PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC __glewReleaseKeyedMutexWin32EXT; + +GLEW_FUN_EXPORT PFNGLWINDOWRECTANGLESEXTPROC __glewWindowRectanglesEXT; + +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 PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; +GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; +GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; + +GLEW_FUN_EXPORT PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL; +GLEW_FUN_EXPORT PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL; + +GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; +GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; + +GLEW_FUN_EXPORT PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; +GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; +GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; +GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; +GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; +GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; +GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; + +GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSKHRPROC __glewMaxShaderCompilerThreadsKHR; + +GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv; +GLEW_FUN_EXPORT PFNGLREADNPIXELSPROC __glewReadnPixels; + +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 PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; + +GLEW_FUN_EXPORT PFNGLLGPUCOPYIMAGESUBDATANVXPROC __glewLGPUCopyImageSubDataNVX; +GLEW_FUN_EXPORT PFNGLLGPUINTERLOCKNVXPROC __glewLGPUInterlockNVX; +GLEW_FUN_EXPORT PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC __glewLGPUNamedBufferSubDataNVX; + +GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERFNVPROC __glewStereoParameterfNV; +GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERINVPROC __glewStereoParameteriNV; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV; + +GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; +GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; +GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; +GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV; +GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; + +GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; +GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; + +GLEW_FUN_EXPORT PFNGLVIEWPORTPOSITIONWSCALENVPROC __glewViewportPositionWScaleNV; + +GLEW_FUN_EXPORT PFNGLCALLCOMMANDLISTNVPROC __glewCallCommandListNV; +GLEW_FUN_EXPORT PFNGLCOMMANDLISTSEGMENTSNVPROC __glewCommandListSegmentsNV; +GLEW_FUN_EXPORT PFNGLCOMPILECOMMANDLISTNVPROC __glewCompileCommandListNV; +GLEW_FUN_EXPORT PFNGLCREATECOMMANDLISTSNVPROC __glewCreateCommandListsNV; +GLEW_FUN_EXPORT PFNGLCREATESTATESNVPROC __glewCreateStatesNV; +GLEW_FUN_EXPORT PFNGLDELETECOMMANDLISTSNVPROC __glewDeleteCommandListsNV; +GLEW_FUN_EXPORT PFNGLDELETESTATESNVPROC __glewDeleteStatesNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSADDRESSNVPROC __glewDrawCommandsAddressNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSNVPROC __glewDrawCommandsNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC __glewDrawCommandsStatesAddressNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESNVPROC __glewDrawCommandsStatesNV; +GLEW_FUN_EXPORT PFNGLGETCOMMANDHEADERNVPROC __glewGetCommandHeaderNV; +GLEW_FUN_EXPORT PFNGLGETSTAGEINDEXNVPROC __glewGetStageIndexNV; +GLEW_FUN_EXPORT PFNGLISCOMMANDLISTNVPROC __glewIsCommandListNV; +GLEW_FUN_EXPORT PFNGLISSTATENVPROC __glewIsStateNV; +GLEW_FUN_EXPORT PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __glewListDrawCommandsStatesClientNV; +GLEW_FUN_EXPORT PFNGLSTATECAPTURENVPROC __glewStateCaptureNV; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; + +GLEW_FUN_EXPORT PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV; + +GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV; + +GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERINVPROC __glewConservativeRasterParameteriNV; + +GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATANVPROC __glewCopyBufferSubDataNV; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSNVPROC __glewDrawBuffersNV; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDNVPROC __glewDrawArraysInstancedNV; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDNVPROC __glewDrawElementsInstancedNV; + +GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; + +GLEW_FUN_EXPORT PFNGLDRAWVKIMAGENVPROC __glewDrawVkImageNV; +GLEW_FUN_EXPORT PFNGLGETVKPROCADDRNVPROC __glewGetVkProcAddrNV; +GLEW_FUN_EXPORT PFNGLSIGNALVKFENCENVPROC __glewSignalVkFenceNV; +GLEW_FUN_EXPORT PFNGLSIGNALVKSEMAPHORENVPROC __glewSignalVkSemaphoreNV; +GLEW_FUN_EXPORT PFNGLWAITVKSEMAPHORENVPROC __glewWaitVkSemaphoreNV; + +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 PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV; + +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 PFNGLBLITFRAMEBUFFERNVPROC __glewBlitFramebufferNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC __glewRenderbufferStorageMultisampleNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; + +GLEW_FUN_EXPORT PFNGLMULTICASTBARRIERNVPROC __glewMulticastBarrierNV; +GLEW_FUN_EXPORT PFNGLMULTICASTBLITFRAMEBUFFERNVPROC __glewMulticastBlitFramebufferNV; +GLEW_FUN_EXPORT PFNGLMULTICASTBUFFERSUBDATANVPROC __glewMulticastBufferSubDataNV; +GLEW_FUN_EXPORT PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC __glewMulticastCopyBufferSubDataNV; +GLEW_FUN_EXPORT PFNGLMULTICASTCOPYIMAGESUBDATANVPROC __glewMulticastCopyImageSubDataNV; +GLEW_FUN_EXPORT PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewMulticastFramebufferSampleLocationsfvNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC __glewMulticastGetQueryObjecti64vNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTIVNVPROC __glewMulticastGetQueryObjectivNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC __glewMulticastGetQueryObjectui64vNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC __glewMulticastGetQueryObjectuivNV; +GLEW_FUN_EXPORT PFNGLMULTICASTWAITSYNCNVPROC __glewMulticastWaitSyncNV; +GLEW_FUN_EXPORT PFNGLRENDERGPUMASKNVPROC __glewRenderGpuMaskNV; + +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 PFNGLVERTEXATTRIBDIVISORNVPROC __glewVertexAttribDivisorNV; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV; + +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVNVPROC __glewUniformMatrix2x3fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVNVPROC __glewUniformMatrix2x4fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVNVPROC __glewUniformMatrix3x2fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVNVPROC __glewUniformMatrix3x4fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVNVPROC __glewUniformMatrix4x2fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVNVPROC __glewUniformMatrix4x3fvNV; + +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 PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV; +GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV; +GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV; +GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV; +GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV; +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 PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV; +GLEW_FUN_EXPORT PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV; +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 PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV; +GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV; +GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV; +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 PFNGLPOLYGONMODENVPROC __glewPolygonModeNV; + +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 PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV; + +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 PFNGLCOMPRESSEDTEXIMAGE3DNVPROC __glewCompressedTexImage3DNV; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC __glewCompressedTexSubImage3DNV; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DNVPROC __glewCopyTexSubImage3DNV; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERNVPROC __glewFramebufferTextureLayerNV; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DNVPROC __glewTexImage3DNV; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DNVPROC __glewTexSubImage3DNV; + +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 PFNGLDEPTHRANGEARRAYFVNVPROC __glewDepthRangeArrayfvNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDFNVPROC __glewDepthRangeIndexedfNV; +GLEW_FUN_EXPORT PFNGLDISABLEINVPROC __glewDisableiNV; +GLEW_FUN_EXPORT PFNGLENABLEINVPROC __glewEnableiNV; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VNVPROC __glewGetFloati_vNV; +GLEW_FUN_EXPORT PFNGLISENABLEDINVPROC __glewIsEnablediNV; +GLEW_FUN_EXPORT PFNGLSCISSORARRAYVNVPROC __glewScissorArrayvNV; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDNVPROC __glewScissorIndexedNV; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVNVPROC __glewScissorIndexedvNV; +GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVNVPROC __glewViewportArrayvNV; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFNVPROC __glewViewportIndexedfNV; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVNVPROC __glewViewportIndexedfvNV; + +GLEW_FUN_EXPORT PFNGLVIEWPORTSWIZZLENVPROC __glewViewportSwizzleNV; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __glewFramebufferTextureMultisampleMultiviewOVR; + +GLEW_FUN_EXPORT PFNGLALPHAFUNCQCOMPROC __glewAlphaFuncQCOM; + +GLEW_FUN_EXPORT PFNGLDISABLEDRIVERCONTROLQCOMPROC __glewDisableDriverControlQCOM; +GLEW_FUN_EXPORT PFNGLENABLEDRIVERCONTROLQCOMPROC __glewEnableDriverControlQCOM; +GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSTRINGQCOMPROC __glewGetDriverControlStringQCOM; +GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSQCOMPROC __glewGetDriverControlsQCOM; + +GLEW_FUN_EXPORT PFNGLEXTGETBUFFERPOINTERVQCOMPROC __glewExtGetBufferPointervQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETBUFFERSQCOMPROC __glewExtGetBuffersQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETFRAMEBUFFERSQCOMPROC __glewExtGetFramebuffersQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETRENDERBUFFERSQCOMPROC __glewExtGetRenderbuffersQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC __glewExtGetTexLevelParameterivQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETTEXSUBIMAGEQCOMPROC __glewExtGetTexSubImageQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETTEXTURESQCOMPROC __glewExtGetTexturesQCOM; +GLEW_FUN_EXPORT PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC __glewExtTexObjectStateOverrideiQCOM; + +GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC __glewExtGetProgramBinarySourceQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMSQCOMPROC __glewExtGetProgramsQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETSHADERSQCOMPROC __glewExtGetShadersQCOM; +GLEW_FUN_EXPORT PFNGLEXTISPROGRAMBINARYQCOMPROC __glewExtIsProgramBinaryQCOM; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC __glewFramebufferFoveationConfigQCOM; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC __glewFramebufferFoveationParametersQCOM; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC __glewFramebufferFetchBarrierQCOM; + +GLEW_FUN_EXPORT PFNGLENDTILINGQCOMPROC __glewEndTilingQCOM; +GLEW_FUN_EXPORT PFNGLSTARTTILINGQCOMPROC __glewStartTilingQCOM; + +GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; +GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; +GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; +GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; +GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; +GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; +GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; +GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; +GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; +GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; +GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; +GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; +GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; +GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; +GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; +GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; +GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; +GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; +GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; +GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; +GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; +GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; +GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; +GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; + +GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; +GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; +GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; +GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; +GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; +GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; + +GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; + +GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; +GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; + +GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; + +GLEW_FUN_EXPORT PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL; + +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 PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC __glewInterleavedTextureCoordSetsSGIS; +GLEW_FUN_EXPORT PFNGLSELECTTEXTURECOORDSETSGISPROC __glewSelectTextureCoordSetSGIS; +GLEW_FUN_EXPORT PFNGLSELECTTEXTURESGISPROC __glewSelectTextureSGIS; +GLEW_FUN_EXPORT PFNGLSELECTTEXTURETRANSFORMSGISPROC __glewSelectTextureTransformSGIS; + +GLEW_FUN_EXPORT PFNGLMULTISAMPLESUBRECTPOSSGISPROC __glewMultisampleSubRectPosSGIS; + +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 PFNGLADDRESSSPACEPROC __glewAddressSpace; +GLEW_FUN_EXPORT PFNGLDATAPIPEPROC __glewDataPipe; + +GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; + +GLEW_FUN_EXPORT PFNGLFOGLAYERSSGIXPROC __glewFogLayersSGIX; +GLEW_FUN_EXPORT PFNGLGETFOGLAYERSSGIXPROC __glewGetFogLayersSGIX; + +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 PFNGLIGLOOINTERFACESGIXPROC __glewIglooInterfaceSGIX; + +GLEW_FUN_EXPORT PFNGLALLOCMPEGPREDICTORSSGIXPROC __glewAllocMPEGPredictorsSGIX; +GLEW_FUN_EXPORT PFNGLDELETEMPEGPREDICTORSSGIXPROC __glewDeleteMPEGPredictorsSGIX; +GLEW_FUN_EXPORT PFNGLGENMPEGPREDICTORSSGIXPROC __glewGenMPEGPredictorsSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERFVSGIXPROC __glewGetMPEGParameterfvSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERIVSGIXPROC __glewGetMPEGParameterivSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGPREDICTORSGIXPROC __glewGetMPEGPredictorSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGQUANTTABLEUBVPROC __glewGetMPEGQuantTableubv; +GLEW_FUN_EXPORT PFNGLISMPEGPREDICTORSGIXPROC __glewIsMPEGPredictorSGIX; +GLEW_FUN_EXPORT PFNGLMPEGPREDICTORSGIXPROC __glewMPEGPredictorSGIX; +GLEW_FUN_EXPORT PFNGLMPEGQUANTTABLEUBVPROC __glewMPEGQuantTableubv; +GLEW_FUN_EXPORT PFNGLSWAPMPEGPREDICTORSSGIXPROC __glewSwapMPEGPredictorsSGIX; + +GLEW_FUN_EXPORT PFNGLGETNONLINLIGHTFVSGIXPROC __glewGetNonlinLightfvSGIX; +GLEW_FUN_EXPORT PFNGLGETNONLINMATERIALFVSGIXPROC __glewGetNonlinMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLNONLINLIGHTFVSGIXPROC __glewNonlinLightfvSGIX; +GLEW_FUN_EXPORT PFNGLNONLINMATERIALFVSGIXPROC __glewNonlinMaterialfvSGIX; + +GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; + +GLEW_FUN_EXPORT PFNGLDEFORMSGIXPROC __glewDeformSGIX; +GLEW_FUN_EXPORT PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC __glewLoadIdentityDeformationMapSGIX; + +GLEW_FUN_EXPORT PFNGLMESHBREADTHSGIXPROC __glewMeshBreadthSGIX; +GLEW_FUN_EXPORT PFNGLMESHSTRIDESGIXPROC __glewMeshStrideSGIX; + +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 PFNGLGETVECTOROPERATIONSGIXPROC __glewGetVectorOperationSGIX; +GLEW_FUN_EXPORT PFNGLVECTOROPERATIONSGIXPROC __glewVectorOperationSGIX; + +GLEW_FUN_EXPORT PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC __glewAreVertexArraysResidentSGIX; +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYSGIXPROC __glewBindVertexArraySGIX; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSSGIXPROC __glewDeleteVertexArraysSGIX; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSSGIXPROC __glewGenVertexArraysSGIX; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYSGIXPROC __glewIsVertexArraySGIX; +GLEW_FUN_EXPORT PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC __glewPrioritizeVertexArraysSGIX; + +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 PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC __glewGetPixelTransformParameterfvSGI; +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC __glewGetPixelTransformParameterivSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFSGIPROC __glewPixelTransformParameterfSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC __glewPixelTransformParameterfvSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERISGIPROC __glewPixelTransformParameteriSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC __glewPixelTransformParameterivSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMSGIPROC __glewPixelTransformSGI; + +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; +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_VERSION_4_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_5; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_6; +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_compressed_3DC_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_ATC_texture; +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_framebuffer_sample_positions; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int16; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_occlusion_query_event; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_program_binary_Z400; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; +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_atomic_counter_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_ballot; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_explicit_vertex_parameter; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_value_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_gather_bias_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; +GLEW_VAR_EXPORT GLboolean __GLEW_ANDROID_extension_pack_es31a; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_clip_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_color_buffer_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_copy_texture_levels; +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_framebuffer_multisample; +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_sync; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_2D_limited_npot; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_format_BGRA8888; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_max_level; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_packed_float; +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_ES3_1_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_2_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clip_control; +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_compute_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conditional_render_inverted; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cull_distance; +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_derivative_control; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_direct_state_access; +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_enhanced_layouts; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport; +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_fragment_shader_interlock; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments; +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_get_texture_sub_image; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gl_spirv; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_int64; +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_indirect_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; +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_multi_bind; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; +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_parallel_shader_compile; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pipeline_statistics_query; +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_polygon_offset_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_post_depth_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_locations; +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_seamless_cubemap_per_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counter_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_ballot; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_clock; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; +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_storage_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_image_samples; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_viewport_layer_array; +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_sparse_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_spirv_extensions; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_barrier; +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_buffer_range; +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_filter_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; +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_levels; +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_stencil8; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view; +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_transform_feedback_overflow_query; +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_attrib_binding; +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_10f_11f_11f_rev; +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_ARM_mali_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_shader_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_rgba8; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch_depth_stencil; +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_EGL_KHR_context_flush_control; +GLEW_VAR_EXPORT GLboolean __GLEW_EGL_NV_robustness_video_memory_purge; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_EGL_image_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_YUV_target; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_base_instance; +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_extended; +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_buffer_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clear_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_cull_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compressed_ETC1_RGB8_sub_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_label; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_discard_framebuffer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers_indexed; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_elements_base_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_external_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_float_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_frag_depth; +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_point_size; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader; +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_gpu_shader5; +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_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_map_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_fd; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_win32; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiple_textures; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiview_draw_buffers; +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_polygon_offset_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_post_depth_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pvrtc_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_raster_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_read_format_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_render_snorm; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB_write_control; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_fd; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_win32; +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_framebuffer_fetch; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_group_vote; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_implicit_conversions; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_io_blocks; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_non_constant_global_initializers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_samplers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture2; +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_astc_decode_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_bptc; +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_cube_map_array; +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_filter_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_format_BGRA8888; +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_norm16; +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_rg; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_R8; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_RG8; +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_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_type_2_10_10_10_REV; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_view; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_unpack_subimage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_setXXX; +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_win32_keyed_mutex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_window_rectangles; +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_conservative_rasterization; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_fragment_shader_ordering; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_framebuffer_CMAA; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_performance_query; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced_coherent; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_context_flush_control; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_no_error; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_parallel_shader_compile; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robust_buffer_access_behavior; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robustness; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_hdr; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_sliced_3d; +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_shader_integer_functions; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_blend_equation_advanced_multi_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_linked_gpu_multicast; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_3dvision_settings; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_EGL_stream_consumer_external; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_alpha_to_coverage_dither_control; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bgr; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect_count; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_minmax_factor; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_clip_space_w_scaling; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_command_list; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_dilate; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_pre_snap_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; +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_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_vulkan_image; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_attrib_location; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fbo_color_attachments; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fill_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_coverage_to_color; +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_fragment_shader_interlock; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_mixed_samples; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_generate_mipmap_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader_passthrough; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_multicast; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; +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_image_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_internalformat_sample_query; +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_non_square_matrices; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pack_subimage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float_linear; +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_path_rendering_shared_edge; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_platform_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_polygon_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_robustness_video_memory_purge; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sRGB_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_locations; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_mask_override_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_fp16_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_noperspective_interpolation; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_array; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_cube; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_stereo_view_rendering; +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_array; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_latc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc_update; +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_npot_2D_mipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle_compressed; +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_uniform_buffer_unified_memory; +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_NV_viewport_array; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; +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_OVR_multiview; +GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview2; +GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview_multisampled_render_to_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_alpha_test; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_binning_control; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_driver_control; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get2; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_framebuffer_foveated; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_perfmon_global_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_shader_framebuffer_fetch_noncoherent; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_tiled_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_writeonly_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_proc_address; +GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_clip_band_hint; +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_line_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multitexture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_shared_multisample; +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_bali_g_instruments; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_r_instruments; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_timer_instruments; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cadd; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cmultiply; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_calligraphic_fragment; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_matrix_accuracy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_table_index_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_complex_polar; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cylinder_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_datapipe; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_decimation; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_pass_instrument; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_dvc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_factor_to_alpha; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_layers; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_patchy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_scale; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_lighting_space; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragments_instrument; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_icc_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_igloo_interface; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_image_compression; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_impact_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_instrument_error; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_line_quality_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg2; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nonlinear_lighting_pervertex; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nurbs_eval; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_occlusion_instrument; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_packed_6bytes; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_tiles; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_polynomial_ffd; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_quad_mesh; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_scalebias_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_slim; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_spotlight_cutoff; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subdiv_patch; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subsample; +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_mipmap_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_phase; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_supersample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vector_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_array_object; +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_SGIX_ycrcb_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcba; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex_type; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_fft; +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_scene_markerXXX; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; +/* ------------------------------------------------------------------------- */ + +/* 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 */ +#define GLEW_ERROR_NO_GLX_DISPLAY 4 /* Need GLX display for GLX support */ + +/* string codes */ +#define GLEW_VERSION 1 +#define GLEW_VERSION_MAJOR 2 +#define GLEW_VERSION_MINOR 3 +#define GLEW_VERSION_MICRO 4 + +/* ------------------------------------------------------------------------- */ + +/* GLEW version info */ + +/* +VERSION 2.1.0 +VERSION_MAJOR 2 +VERSION_MINOR 1 +VERSION_MICRO 0 +*/ + +/* API */ +GLEWAPI GLenum GLEWAPIENTRY glewInit (void); +GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#ifndef GLEW_GET_VAR +#define GLEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef GLEW_GET_FUN +#define GLEW_GET_FUN(x) x +#endif + +GLEWAPI GLboolean glewExperimental; +GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); +GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); +GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); + +#ifdef __cplusplus +} +#endif + +#ifdef GLEW_APIENTRY_DEFINED +#undef GLEW_APIENTRY_DEFINED +#undef APIENTRY +#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/NothinFancy/dep/include/GL/glxew.h b/NothinFancy/dep/include/GL/glxew.h new file mode 100644 index 0000000..7e39c2f --- /dev/null +++ b/NothinFancy/dep/include/GL/glxew.h @@ -0,0 +1,1775 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** 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 +#include +#include +#include + +#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_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_PIXMAP_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 + +typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list); +typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList); +typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx); +typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx); +typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); +typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids); +typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data); +typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx); + +#define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD) +#define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD) +#define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD) +#define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD) +#define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD) +#define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD) +#define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD) +#define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD) +#define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD) + +#define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) + +#endif /* GLX_AMD_gpu_association */ + +/* --------------------- GLX_ARB_context_flush_control --------------------- */ + +#ifndef GLX_ARB_context_flush_control +#define GLX_ARB_context_flush_control 1 + +#define GLXEW_ARB_context_flush_control GLXEW_GET_VAR(__GLXEW_ARB_context_flush_control) + +#endif /* GLX_ARB_context_flush_control */ + +/* ------------------------- 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_no_error -------------------- */ + +#ifndef GLX_ARB_create_context_no_error +#define GLX_ARB_create_context_no_error 1 + +#define GLXEW_ARB_create_context_no_error GLXEW_GET_VAR(__GLXEW_ARB_create_context_no_error) + +#endif /* GLX_ARB_create_context_no_error */ + +/* --------------------- 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_ARB 0x00000004 +#define GLX_RGBA_FLOAT_TYPE_ARB 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_robustness_application_isolation --------------- */ + +#ifndef GLX_ARB_robustness_application_isolation +#define GLX_ARB_robustness_application_isolation 1 + +#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define GLXEW_ARB_robustness_application_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_application_isolation) + +#endif /* GLX_ARB_robustness_application_isolation */ + +/* ---------------- GLX_ARB_robustness_share_group_isolation --------------- */ + +#ifndef GLX_ARB_robustness_share_group_isolation +#define GLX_ARB_robustness_share_group_isolation 1 + +#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define GLXEW_ARB_robustness_share_group_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_share_group_isolation) + +#endif /* GLX_ARB_robustness_share_group_isolation */ + +/* ---------------------- 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_buffer_age -------------------------- */ + +#ifndef GLX_EXT_buffer_age +#define GLX_EXT_buffer_age 1 + +#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 + +#define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age) + +#endif /* GLX_EXT_buffer_age */ + +/* ------------------- 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_create_context_es_profile ------------------- */ + +#ifndef GLX_EXT_create_context_es_profile +#define GLX_EXT_create_context_es_profile 1 + +#define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 + +#define GLXEW_EXT_create_context_es_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es_profile) + +#endif /* GLX_EXT_create_context_es_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_libglvnd --------------------------- */ + +#ifndef GLX_EXT_libglvnd +#define GLX_EXT_libglvnd 1 + +#define GLX_VENDOR_NAMES_EXT 0x20F6 + +#define GLXEW_EXT_libglvnd GLXEW_GET_VAR(__GLXEW_EXT_libglvnd) + +#endif /* GLX_EXT_libglvnd */ + +/* -------------------------- 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_stereo_tree -------------------------- */ + +#ifndef GLX_EXT_stereo_tree +#define GLX_EXT_stereo_tree 1 + +#define GLX_STEREO_NOTIFY_EXT 0x00000000 +#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 +#define GLX_STEREO_TREE_EXT 0x20F5 + +#define GLXEW_EXT_stereo_tree GLXEW_GET_VAR(__GLXEW_EXT_stereo_tree) + +#endif /* GLX_EXT_stereo_tree */ + +/* -------------------------- 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_swap_control_tear ----------------------- */ + +#ifndef GLX_EXT_swap_control_tear +#define GLX_EXT_swap_control_tear 1 + +#define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 + +#define GLXEW_EXT_swap_control_tear GLXEW_GET_VAR(__GLXEW_EXT_swap_control_tear) + +#endif /* GLX_EXT_swap_control_tear */ + +/* ---------------------- 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_query_renderer ------------------------ */ + +#ifndef GLX_MESA_query_renderer +#define GLX_MESA_query_renderer 1 + +#define GLX_RENDERER_VENDOR_ID_MESA 0x8183 +#define GLX_RENDERER_DEVICE_ID_MESA 0x8184 +#define GLX_RENDERER_VERSION_MESA 0x8185 +#define GLX_RENDERER_ACCELERATED_MESA 0x8186 +#define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187 +#define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188 +#define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189 +#define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A +#define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B +#define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C +#define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D +#define GLX_RENDERER_ID_MESA 0x818E + +typedef Bool ( * PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) (int attribute, unsigned int* value); +typedef const char* ( * PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) (int attribute); +typedef Bool ( * PFNGLXQUERYRENDERERINTEGERMESAPROC) (Display* dpy, int screen, int renderer, int attribute, unsigned int *value); +typedef const char* ( * PFNGLXQUERYRENDERERSTRINGMESAPROC) (Display *dpy, int screen, int renderer, int attribute); + +#define glXQueryCurrentRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererIntegerMESA) +#define glXQueryCurrentRendererStringMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererStringMESA) +#define glXQueryRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryRendererIntegerMESA) +#define glXQueryRendererStringMESA GLXEW_GET_FUN(__glewXQueryRendererStringMESA) + +#define GLXEW_MESA_query_renderer GLXEW_GET_VAR(__GLXEW_MESA_query_renderer) + +#endif /* GLX_MESA_query_renderer */ + +/* ------------------------ 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_buffer -------------------------- */ + +#ifndef GLX_NV_copy_buffer +#define GLX_NV_copy_buffer 1 + +typedef void ( * PFNGLXCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void ( * PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); + +#define glXCopyBufferSubDataNV GLXEW_GET_FUN(__glewXCopyBufferSubDataNV) +#define glXNamedCopyBufferSubDataNV GLXEW_GET_FUN(__glewXNamedCopyBufferSubDataNV) + +#define GLXEW_NV_copy_buffer GLXEW_GET_VAR(__GLXEW_NV_copy_buffer) + +#endif /* GLX_NV_copy_buffer */ + +/* --------------------------- 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_delay_before_swap ----------------------- */ + +#ifndef GLX_NV_delay_before_swap +#define GLX_NV_delay_before_swap 1 + +typedef Bool ( * PFNGLXDELAYBEFORESWAPNVPROC) (Display* dpy, GLXDrawable drawable, GLfloat seconds); + +#define glXDelayBeforeSwapNV GLXEW_GET_FUN(__glewXDelayBeforeSwapNV) + +#define GLXEW_NV_delay_before_swap GLXEW_GET_VAR(__GLXEW_NV_delay_before_swap) + +#endif /* GLX_NV_delay_before_swap */ + +/* -------------------------- 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_robustness_video_memory_purge ----------------- */ + +#ifndef GLX_NV_robustness_video_memory_purge +#define GLX_NV_robustness_video_memory_purge 1 + +#define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7 + +#define GLXEW_NV_robustness_video_memory_purge GLXEW_GET_VAR(__GLXEW_NV_robustness_video_memory_purge) + +#endif /* GLX_NV_robustness_video_memory_purge */ + +/* --------------------------- 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_out --------------------------- */ + +#ifndef GLX_NV_video_out +#define GLX_NV_video_out 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_out GLXEW_GET_VAR(__GLXEW_NV_video_out) + +#endif /* GLX_NV_video_out */ + +/* -------------------------- 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 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_RGBA_BIT_SGIX 0x00000001 +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_PIXMAP_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_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 +#define GLX_PIPE_RECT_LIMITS_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_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#define GLX_PBUFFER_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 */ + +/* ------------------------------------------------------------------------- */ + +#define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT +#define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT + +GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; + +GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; +GLXEW_FUN_EXPORT PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; +GLXEW_FUN_EXPORT PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; +GLXEW_FUN_EXPORT PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; +GLXEW_FUN_EXPORT PFNGLXCREATEWINDOWPROC __glewXCreateWindow; +GLXEW_FUN_EXPORT PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; +GLXEW_FUN_EXPORT PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; +GLXEW_FUN_EXPORT PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; +GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; +GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; +GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; +GLXEW_FUN_EXPORT PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; +GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; +GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; +GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; + +GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD; +GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD; +GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD; +GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD; +GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD; +GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD; + +GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; + +GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; +GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; +GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; + +GLXEW_FUN_EXPORT PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; +GLXEW_FUN_EXPORT PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; +GLXEW_FUN_EXPORT PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; +GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; + +GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT; + +GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; +GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; + +GLXEW_FUN_EXPORT PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; + +GLXEW_FUN_EXPORT PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; + +GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; + +GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA; +GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA; +GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA; +GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA; + +GLXEW_FUN_EXPORT PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; + +GLXEW_FUN_EXPORT PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; + +GLXEW_FUN_EXPORT PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA; +GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA; + +GLXEW_FUN_EXPORT PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV; +GLXEW_FUN_EXPORT PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV; + +GLXEW_FUN_EXPORT PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV; + +GLXEW_FUN_EXPORT PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV; + +GLXEW_FUN_EXPORT PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV; +GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV; + +GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV; +GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV; +GLXEW_FUN_EXPORT PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV; +GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV; +GLXEW_FUN_EXPORT PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV; +GLXEW_FUN_EXPORT PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV; + +GLXEW_FUN_EXPORT PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; +GLXEW_FUN_EXPORT PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; + +GLXEW_FUN_EXPORT PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV; +GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV; +GLXEW_FUN_EXPORT PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV; +GLXEW_FUN_EXPORT PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV; +GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV; + +GLXEW_FUN_EXPORT PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV; +GLXEW_FUN_EXPORT PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV; +GLXEW_FUN_EXPORT PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV; +GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV; +GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV; +GLXEW_FUN_EXPORT PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV; + +GLXEW_FUN_EXPORT PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; +GLXEW_FUN_EXPORT PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; +GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; +GLXEW_FUN_EXPORT PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; +GLXEW_FUN_EXPORT PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; + +GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; +GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; + +GLXEW_FUN_EXPORT PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; +GLXEW_FUN_EXPORT PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; + +GLXEW_FUN_EXPORT PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; +GLXEW_FUN_EXPORT PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; +GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; +GLXEW_FUN_EXPORT PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; + +GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; + +GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; + +GLXEW_FUN_EXPORT PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; +GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; +GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; + +GLXEW_FUN_EXPORT PFNGLXCUSHIONSGIPROC __glewXCushionSGI; + +GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; +GLXEW_FUN_EXPORT PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; + +GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; + +GLXEW_FUN_EXPORT PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; +GLXEW_FUN_EXPORT PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; + +GLXEW_FUN_EXPORT PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; + +GLXEW_FUN_EXPORT PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; +GLXEW_FUN_EXPORT PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_3; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_4; +GLXEW_VAR_EXPORT GLboolean __GLXEW_3DFX_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_AMD_gpu_association; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_context_flush_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_no_error; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_profile; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_robustness; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_get_proc_address; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_application_isolation; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_libglvnd; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_stereo_tree; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_info; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_rating; +GLXEW_VAR_EXPORT GLboolean __GLXEW_INTEL_swap_event; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_agp_offset; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_query_renderer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_release_buffers; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_swap_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_buffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_image; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_delay_before_swap; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_float_buffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multisample_coverage; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_robustness_video_memory_purge; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; +GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; +GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_color_range; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_fbconfig; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_pbuffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_group; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_video_resize; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_cushion; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_make_current_read; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_swap_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_video_sync; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_video_resize; +/* ------------------------------------------------------------------------ */ + +GLEWAPI GLenum GLEWAPIENTRY glxewInit (); +GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name); + +#ifndef GLXEW_GET_VAR +#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef GLXEW_GET_FUN +#define GLXEW_GET_FUN(x) x +#endif + +GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name); + +#ifdef __cplusplus +} +#endif + +#endif /* __glxew_h__ */ diff --git a/NothinFancy/dep/include/GL/wglew.h b/NothinFancy/dep/include/GL/wglew.h new file mode 100644 index 0000000..2097c0f --- /dev/null +++ b/NothinFancy/dep/include/GL/wglew.h @@ -0,0 +1,1447 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** 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 +# 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_context_flush_control --------------------- */ + +#ifndef WGL_ARB_context_flush_control +#define WGL_ARB_context_flush_control 1 + +#define WGLEW_ARB_context_flush_control WGLEW_GET_VAR(__WGLEW_ARB_context_flush_control) + +#endif /* WGL_ARB_context_flush_control */ + +/* ------------------------- 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_no_error -------------------- */ + +#ifndef WGL_ARB_create_context_no_error +#define WGL_ARB_create_context_no_error 1 + +#define WGLEW_ARB_create_context_no_error WGLEW_GET_VAR(__WGLEW_ARB_create_context_no_error) + +#endif /* WGL_ARB_create_context_no_error */ + +/* --------------------- 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_ARB_robustness_application_isolation --------------- */ + +#ifndef WGL_ARB_robustness_application_isolation +#define WGL_ARB_robustness_application_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) + +#endif /* WGL_ARB_robustness_application_isolation */ + +/* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ + +#ifndef WGL_ARB_robustness_share_group_isolation +#define WGL_ARB_robustness_share_group_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) + +#endif /* WGL_ARB_robustness_share_group_isolation */ + +/* ----------------------- 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_colorspace -------------------------- */ + +#ifndef WGL_EXT_colorspace +#define WGL_EXT_colorspace 1 + +#define WGL_COLORSPACE_SRGB_EXT 0x3089 +#define WGL_COLORSPACE_LINEAR_EXT 0x308A +#define WGL_COLORSPACE_EXT 0x309D + +#define WGLEW_EXT_colorspace WGLEW_GET_VAR(__WGLEW_EXT_colorspace) + +#endif /* WGL_EXT_colorspace */ + +/* ------------------- 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_create_context_es_profile ------------------- */ + +#ifndef WGL_EXT_create_context_es_profile +#define WGL_EXT_create_context_es_profile 1 + +#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 + +#define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile) + +#endif /* WGL_EXT_create_context_es_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_EXT_swap_control_tear ----------------------- */ + +#ifndef WGL_EXT_swap_control_tear +#define WGL_EXT_swap_control_tear 1 + +#define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear) + +#endif /* WGL_EXT_swap_control_tear */ + +/* --------------------- 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_DX_interop2 -------------------------- */ + +#ifndef WGL_NV_DX_interop2 +#define WGL_NV_DX_interop2 1 + +#define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2) + +#endif /* WGL_NV_DX_interop2 */ + +/* --------------------------- 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_delay_before_swap ----------------------- */ + +#ifndef WGL_NV_delay_before_swap +#define WGL_NV_delay_before_swap 1 + +typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds); + +#define wglDelayBeforeSwapNV WGLEW_GET_FUN(__wglewDelayBeforeSwapNV) + +#define WGLEW_NV_delay_before_swap WGLEW_GET_VAR(__WGLEW_NV_delay_before_swap) + +#endif /* WGL_NV_delay_before_swap */ + +/* -------------------------- 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 */ + +/* ------------------------------------------------------------------------- */ + +#define WGLEW_FUN_EXPORT GLEW_FUN_EXPORT +#define WGLEW_VAR_EXPORT GLEW_VAR_EXPORT + +WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; + +WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; +WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; +WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; +WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; +WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; +WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; + +WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; + +WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; + +WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; + +WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; +WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; + +WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; +WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; +WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; +WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; +WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; + +WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; + +WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; +WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; +WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; + +WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; + +WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; + +WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; +WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; + +WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; +WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; +WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; +WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; +WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; + +WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; + +WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; +WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; + +WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; +WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; + +WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; +WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; +WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; +WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; + +WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; +WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; + +WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; +WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; +WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; +WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; + +WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; + +WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; +WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; +WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; + +WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; +WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; +WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; +WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; +WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; +WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; +WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; +WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; + +WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; + +WGLEW_FUN_EXPORT PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV; + +WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; +WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; +WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; + +WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; +WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; +WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; +WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; +WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; + +WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; +WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; +WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; +WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; +WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; + +WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; +WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; +WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; +WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; +WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; +WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; +WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_context_flush_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_no_error; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_colorspace; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_delay_before_swap; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output; +WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control; +/* ------------------------------------------------------------------------- */ + +GLEWAPI GLenum GLEWAPIENTRY wglewInit (); +GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); + +#ifndef WGLEW_GET_VAR +#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef WGLEW_GET_FUN +#define WGLEW_GET_FUN(x) x +#endif + +GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); + +#ifdef __cplusplus +} +#endif + +#undef GLEWAPI + +#endif /* __wglew_h__ */ diff --git a/NothinFancy/dep/include/freetype/config/ftconfig.h b/NothinFancy/dep/include/freetype/config/ftconfig.h new file mode 100644 index 0000000..65effcb --- /dev/null +++ b/NothinFancy/dep/include/freetype/config/ftconfig.h @@ -0,0 +1,51 @@ +/**************************************************************************** + * + * ftconfig.h + * + * ANSI-specific configuration file (specification only). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This header file contains a number of macro definitions that are used by + * the rest of the engine. Most of the macros here are automatically + * determined at compile time, and you should not need to change it to port + * FreeType, except to compile the library with a non-ANSI compiler. + * + * Note however that if some specific modifications are needed, we advise + * you to place a modified copy in your build directory. + * + * The build directory is usually `builds/`, and contains + * system-specific files that are always included first when building the + * library. + * + * This ANSI version should stay in `include/config/`. + * + */ + +#ifndef FTCONFIG_H_ +#define FTCONFIG_H_ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + +#include +#include +#include + +#endif /* FTCONFIG_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/config/ftheader.h b/NothinFancy/dep/include/freetype/config/ftheader.h new file mode 100644 index 0000000..e46d314 --- /dev/null +++ b/NothinFancy/dep/include/freetype/config/ftheader.h @@ -0,0 +1,824 @@ +/**************************************************************************** + * + * ftheader.h + * + * Build macros of the FreeType 2 library. + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef FTHEADER_H_ +#define FTHEADER_H_ + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_BEGIN_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_END_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }` block when included from a */ + /* C++ compiler. */ + /* */ +#ifndef FT_BEGIN_HEADER +# ifdef __cplusplus +# define FT_BEGIN_HEADER extern "C" { +# else +# define FT_BEGIN_HEADER /* nothing */ +# endif +#endif + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_END_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_BEGIN_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }` block when included from a */ + /* C++ compiler. */ + /* */ +#ifndef FT_END_HEADER +# ifdef __cplusplus +# define FT_END_HEADER } +# else +# define FT_END_HEADER /* nothing */ +# endif +#endif + + + /************************************************************************** + * + * Aliases for the FreeType 2 public and configuration files. + * + */ + + /************************************************************************** + * + * @section: + * header_file_macros + * + * @title: + * Header File Macros + * + * @abstract: + * Macro definitions used to `#include` specific header files. + * + * @description: + * In addition to the normal scheme of including header files like + * + * ``` + * #include + * #include + * #include + * ``` + * + * it is possible to used named macros instead. They can be used + * directly in `#include` statements as in + * + * ``` + * #include FT_FREETYPE_H + * #include FT_MULTIPLE_MASTERS_H + * #include FT_GLYPH_H + * ``` + * + * These macros were introduced to overcome the infamous 8.3~naming rule + * required by DOS (and `FT_MULTIPLE_MASTERS_H` is a lot more meaningful + * than `ftmm.h`). + * + */ + + + /* configuration files */ + + /************************************************************************** + * + * @macro: + * FT_CONFIG_CONFIG_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 configuration data. + * + */ +#ifndef FT_CONFIG_CONFIG_H +#define FT_CONFIG_CONFIG_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_STANDARD_LIBRARY_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 interface to the standard C library functions. + * + */ +#ifndef FT_CONFIG_STANDARD_LIBRARY_H +#define FT_CONFIG_STANDARD_LIBRARY_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_OPTIONS_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 project-specific configuration options. + * + */ +#ifndef FT_CONFIG_OPTIONS_H +#define FT_CONFIG_OPTIONS_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_MODULES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 modules that are statically linked to new library + * instances in @FT_Init_FreeType. + * + */ +#ifndef FT_CONFIG_MODULES_H +#define FT_CONFIG_MODULES_H +#endif + + /* */ + + /* public headers */ + + /************************************************************************** + * + * @macro: + * FT_FREETYPE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * base FreeType~2 API. + * + */ +#define FT_FREETYPE_H + + + /************************************************************************** + * + * @macro: + * FT_ERRORS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 error codes (and messages). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_ERRORS_H + + + /************************************************************************** + * + * @macro: + * FT_MODULE_ERRORS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 module error offsets (and messages). + * + */ +#define FT_MODULE_ERRORS_H + + + /************************************************************************** + * + * @macro: + * FT_SYSTEM_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 interface to low-level operations (i.e., memory management + * and stream i/o). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_SYSTEM_H + + + /************************************************************************** + * + * @macro: + * FT_IMAGE_H + * + * @description: + * A macro used in `#include` statements to name the file containing type + * definitions related to glyph images (i.e., bitmaps, outlines, + * scan-converter parameters). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_IMAGE_H + + + /************************************************************************** + * + * @macro: + * FT_TYPES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * basic data types defined by FreeType~2. + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_TYPES_H + + + /************************************************************************** + * + * @macro: + * FT_LIST_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list management API of FreeType~2. + * + * (Most applications will never need to include this file.) + * + */ +#define FT_LIST_H + + + /************************************************************************** + * + * @macro: + * FT_OUTLINE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * scalable outline management API of FreeType~2. + * + */ +#define FT_OUTLINE_H + + + /************************************************************************** + * + * @macro: + * FT_SIZES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API which manages multiple @FT_Size objects per face. + * + */ +#define FT_SIZES_H + + + /************************************************************************** + * + * @macro: + * FT_MODULE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * module management API of FreeType~2. + * + */ +#define FT_MODULE_H + + + /************************************************************************** + * + * @macro: + * FT_RENDER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * renderer module management API of FreeType~2. + * + */ +#define FT_RENDER_H + + + /************************************************************************** + * + * @macro: + * FT_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the driver modules. + * + */ +#define FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_AUTOHINTER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the auto-hinting module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_AUTOHINTER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_CFF_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the CFF driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_CFF_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the TrueType driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_TRUETYPE_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_PCF_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the PCF driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_PCF_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_TYPE1_TABLES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * types and API specific to the Type~1 format. + * + */ +#define FT_TYPE1_TABLES_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_IDS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * enumeration values which identify name strings, languages, encodings, + * etc. This file really contains a _large_ set of constant macro + * definitions, taken from the TrueType and OpenType specifications. + * + */ +#define FT_TRUETYPE_IDS_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_TABLES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * types and API specific to the TrueType (as well as OpenType) format. + * + */ +#define FT_TRUETYPE_TABLES_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_TAGS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of TrueType four-byte 'tags' which identify blocks in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_TRUETYPE_TAGS_H + + + /************************************************************************** + * + * @macro: + * FT_BDF_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which accesses BDF-specific strings from a face. + * + */ +#define FT_BDF_H + + + /************************************************************************** + * + * @macro: + * FT_CID_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which access CID font information from a face. + * + */ +#define FT_CID_H + + + /************************************************************************** + * + * @macro: + * FT_GZIP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports gzip-compressed files. + * + */ +#define FT_GZIP_H + + + /************************************************************************** + * + * @macro: + * FT_LZW_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports LZW-compressed files. + * + */ +#define FT_LZW_H + + + /************************************************************************** + * + * @macro: + * FT_BZIP2_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports bzip2-compressed files. + * + */ +#define FT_BZIP2_H + + + /************************************************************************** + * + * @macro: + * FT_WINFONTS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports Windows FNT files. + * + */ +#define FT_WINFONTS_H + + + /************************************************************************** + * + * @macro: + * FT_GLYPH_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional glyph management component. + * + */ +#define FT_GLYPH_H + + + /************************************************************************** + * + * @macro: + * FT_BITMAP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional bitmap conversion component. + * + */ +#define FT_BITMAP_H + + + /************************************************************************** + * + * @macro: + * FT_BBOX_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional exact bounding box computation routines. + * + */ +#define FT_BBOX_H + + + /************************************************************************** + * + * @macro: + * FT_CACHE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional FreeType~2 cache sub-system. + * + */ +#define FT_CACHE_H + + + /************************************************************************** + * + * @macro: + * FT_MAC_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * Macintosh-specific FreeType~2 API. The latter is used to access fonts + * embedded in resource forks. + * + * This header file must be explicitly included by client applications + * compiled on the Mac (note that the base API still works though). + * + */ +#define FT_MAC_H + + + /************************************************************************** + * + * @macro: + * FT_MULTIPLE_MASTERS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional multiple-masters management API of FreeType~2. + * + */ +#define FT_MULTIPLE_MASTERS_H + + + /************************************************************************** + * + * @macro: + * FT_SFNT_NAMES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which accesses embedded 'name' strings in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_SFNT_NAMES_H + + + /************************************************************************** + * + * @macro: + * FT_OPENTYPE_VALIDATE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which validates OpenType tables ('BASE', + * 'GDEF', 'GPOS', 'GSUB', 'JSTF'). + * + */ +#define FT_OPENTYPE_VALIDATE_H + + + /************************************************************************** + * + * @macro: + * FT_GX_VALIDATE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which validates TrueTypeGX/AAT tables ('feat', + * 'mort', 'morx', 'bsln', 'just', 'kern', 'opbd', 'trak', 'prop'). + * + */ +#define FT_GX_VALIDATE_H + + + /************************************************************************** + * + * @macro: + * FT_PFR_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which accesses PFR-specific data. + * + */ +#define FT_PFR_H + + + /************************************************************************** + * + * @macro: + * FT_STROKER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which provides functions to stroke outline paths. + */ +#define FT_STROKER_H + + + /************************************************************************** + * + * @macro: + * FT_SYNTHESIS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs artificial obliquing and emboldening. + */ +#define FT_SYNTHESIS_H + + + /************************************************************************** + * + * @macro: + * FT_FONT_FORMATS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which provides functions specific to font formats. + */ +#define FT_FONT_FORMATS_H + + /* deprecated */ +#define FT_XFREE86_H FT_FONT_FORMATS_H + + + /************************************************************************** + * + * @macro: + * FT_TRIGONOMETRY_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs trigonometric computations (e.g., + * cosines and arc tangents). + */ +#define FT_TRIGONOMETRY_H + + + /************************************************************************** + * + * @macro: + * FT_LCD_FILTER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_LCD_FILTER_H + + + /************************************************************************** + * + * @macro: + * FT_INCREMENTAL_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs incremental glyph loading. + */ +#define FT_INCREMENTAL_H + + + /************************************************************************** + * + * @macro: + * FT_GASP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which returns entries from the TrueType GASP table. + */ +#define FT_GASP_H + + + /************************************************************************** + * + * @macro: + * FT_ADVANCES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which returns individual and ranged glyph advances. + */ +#define FT_ADVANCES_H + + + /************************************************************************** + * + * @macro: + * FT_COLOR_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which handles the OpenType 'CPAL' table. + */ +#define FT_COLOR_H + + + /* */ + + /* These header files don't need to be included by the user. */ +#define FT_ERROR_DEFINITIONS_H +#define FT_PARAMETER_TAGS_H + + /* Deprecated macros. */ +#define FT_UNPATENTED_HINTING_H +#define FT_TRUETYPE_UNPATENTED_H + + /* `FT_CACHE_H` is the only header file needed for the cache subsystem. */ +#define FT_CACHE_IMAGE_H FT_CACHE_H +#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H +#define FT_CACHE_CHARMAP_H FT_CACHE_H + + /* The internals of the cache sub-system are no longer exposed. We */ + /* default to `FT_CACHE_H` at the moment just in case, but we know */ + /* of no rogue client that uses them. */ + /* */ +#define FT_CACHE_MANAGER_H FT_CACHE_H +#define FT_CACHE_INTERNAL_MRU_H FT_CACHE_H +#define FT_CACHE_INTERNAL_MANAGER_H FT_CACHE_H +#define FT_CACHE_INTERNAL_CACHE_H FT_CACHE_H +#define FT_CACHE_INTERNAL_GLYPH_H FT_CACHE_H +#define FT_CACHE_INTERNAL_IMAGE_H FT_CACHE_H +#define FT_CACHE_INTERNAL_SBITS_H FT_CACHE_H + +/* TODO(david): Move this section below to a different header */ +#ifdef FT2_BUILD_LIBRARY +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* We disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings. */ + /* In particular, the warning complains about stuff like `while(0)' */ + /* which is very useful in macro definitions. There is no benefit */ + /* in having it enabled. */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ +#endif /* FT2_BUILD_LIBRARY */ + +#endif /* FTHEADER_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/config/ftmodule.h b/NothinFancy/dep/include/freetype/config/ftmodule.h new file mode 100644 index 0000000..d4ba3f7 --- /dev/null +++ b/NothinFancy/dep/include/freetype/config/ftmodule.h @@ -0,0 +1,32 @@ +/* + * This file registers the FreeType modules compiled into the library. + * + * If you use GNU make, this file IS NOT USED! Instead, it is created in + * the objects directory (normally `/objs/`) based on information + * from `/modules.cfg`. + * + * Please read `docs/INSTALL.ANY` and `docs/CUSTOMIZE` how to compile + * FreeType without GNU make. + * + */ + +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_sdf_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_bitmap_sdf_renderer_class ) + +/* EOF */ diff --git a/NothinFancy/dep/include/freetype/config/ftoption.h b/NothinFancy/dep/include/freetype/config/ftoption.h new file mode 100644 index 0000000..4227fd3 --- /dev/null +++ b/NothinFancy/dep/include/freetype/config/ftoption.h @@ -0,0 +1,1011 @@ +/**************************************************************************** + * + * ftoption.h + * + * User-selectable configuration macros (specification only). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTOPTION_H_ +#define FTOPTION_H_ + + +#include + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * USER-SELECTABLE CONFIGURATION MACROS + * + * This file contains the default configuration macro definitions for a + * standard build of the FreeType library. There are three ways to use + * this file to build project-specific versions of the library: + * + * - You can modify this file by hand, but this is not recommended in + * cases where you would like to build several versions of the library + * from a single source directory. + * + * - You can put a copy of this file in your build directory, more + * precisely in `$BUILD/freetype/config/ftoption.h`, where `$BUILD` is + * the name of a directory that is included _before_ the FreeType include + * path during compilation. + * + * The default FreeType Makefiles use the build directory + * `builds/` by default, but you can easily change that for your + * own projects. + * + * - Copy the file to `$BUILD/ft2build.h` and modify it + * slightly to pre-define the macro `FT_CONFIG_OPTIONS_H` used to locate + * this file during the build. For example, + * + * ``` + * #define FT_CONFIG_OPTIONS_H + * #include + * ``` + * + * will use `$BUILD/myftoptions.h` instead of this file for macro + * definitions. + * + * Note also that you can similarly pre-define the macro + * `FT_CONFIG_MODULES_H` used to locate the file listing of the modules + * that are statically linked to the library at compile time. By + * default, this file is ``. + * + * We highly recommend using the third method whenever possible. + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*#************************************************************************ + * + * If you enable this configuration option, FreeType recognizes an + * environment variable called `FREETYPE_PROPERTIES`, which can be used to + * control the various font drivers and modules. The controllable + * properties are listed in the section @properties. + * + * You have to undefine this configuration option on platforms that lack + * the concept of environment variables (and thus don't have the `getenv` + * function), for example Windows CE. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=1 + * ``` + * + */ +#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + + + /************************************************************************** + * + * Uncomment the line below if you want to activate LCD rendering + * technology similar to ClearType in this build of the library. This + * technology triples the resolution in the direction color subpixels. To + * mitigate color fringes inherent to this technology, you also need to + * explicitly set up LCD filtering. + * + * When this macro is not defined, FreeType offers alternative LCD + * rendering technology that produces excellent output. + */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + + /************************************************************************** + * + * Many compilers provide a non-ANSI 64-bit data type that can be used by + * FreeType to speed up some computations. However, this will create some + * problems when compiling the library in strict ANSI mode. + * + * For this reason, the use of 64-bit integers is normally disabled when + * the `__STDC__` macro is defined. You can however disable this by + * defining the macro `FT_CONFIG_OPTION_FORCE_INT64` here. + * + * For most compilers, this will only create compilation warnings when + * building the library. + * + * ObNote: The compiler-specific 64-bit integers are detected in the + * file `ftconfig.h` either statically or through the `configure` + * script on supported platforms. + */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /************************************************************************** + * + * If this macro is defined, do not try to use an assembler version of + * performance-critical functions (e.g., @FT_MulFix). You should only do + * that to verify that the assembler function works properly, or to execute + * benchmark tests of the various implementations. + */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /************************************************************************** + * + * If this macro is defined, try to use an inlined assembler version of the + * @FT_MulFix function, which is a 'hotspot' when loading and hinting + * glyphs, and which should be executed as fast as possible. + * + * Note that if your compiler or CPU is not supported, this will default to + * the standard and portable implementation found in `ftcalc.c`. + */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /************************************************************************** + * + * LZW-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `compress` program. This is mostly used to parse many of the PCF + * files that come with various X11 distributions. The implementation + * uses NetBSD's `zopen` to partially uncompress the file on the fly (see + * `src/lzw/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. + */ +#define FT_CONFIG_OPTION_USE_LZW + + + /************************************************************************** + * + * Gzip-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `gzip` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses 'zlib' to partially + * uncompress the file on the fly (see `src/gzip/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. See also the + * macro `FT_CONFIG_OPTION_SYSTEM_ZLIB` below. + */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /************************************************************************** + * + * ZLib library selection + * + * This macro is only used when `FT_CONFIG_OPTION_USE_ZLIB` is defined. + * It allows FreeType's 'ftgzip' component to link to the system's + * installation of the ZLib library. This is useful on systems like + * Unix or VMS where it generally is already available. + * + * If you let it undefined, the component will use its own copy of the + * zlib sources instead. These have been modified to be included + * directly within the component and **not** export external function + * names. This allows you to link any program with FreeType _and_ ZLib + * without linking conflicts. + * + * Do not `#undef` this macro here since the build system might define + * it for certain configurations only. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + + /************************************************************************** + * + * Bzip2-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `bzip2` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses `libbz2` to partially + * uncompress the file on the fly (see `src/bzip2/ftbzip2.c`). Contrary + * to gzip, bzip2 currently is not included and need to use the system + * available bzip2 implementation. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_BZIP2 */ + + + /************************************************************************** + * + * Define to disable the use of file stream functions and types, `FILE`, + * `fopen`, etc. Enables the use of smaller system libraries on embedded + * systems that have multiple system libraries, some with or without file + * stream support, in the cases where file stream support is not necessary + * such as memory loading of font files. + */ +/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + + + /************************************************************************** + * + * PNG bitmap support. + * + * FreeType now handles loading color bitmap glyphs in the PNG format. + * This requires help from the external libpng library. Uncompressed + * color bitmaps do not need any external libraries and will be supported + * regardless of this configuration. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_PNG */ + + + /************************************************************************** + * + * HarfBuzz support. + * + * FreeType uses the HarfBuzz library to improve auto-hinting of OpenType + * fonts. If available, many glyphs not directly addressable by a font's + * character map will be hinted also. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */ + + + /************************************************************************** + * + * Brotli support. + * + * FreeType uses the Brotli library to provide support for decompressing + * WOFF2 streams. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_BROTLI */ + + + /************************************************************************** + * + * Glyph Postscript Names handling + * + * By default, FreeType 2 is compiled with the 'psnames' module. This + * module is in charge of converting a glyph name string into a Unicode + * value, or return a Macintosh standard glyph name for the use with the + * TrueType 'post' table. + * + * Undefine this macro if you do not want 'psnames' compiled in your + * build of FreeType. This has the following effects: + * + * - The TrueType driver will provide its own set of glyph names, if you + * build it to support postscript names in the TrueType 'post' table, + * but will not synthesize a missing Unicode charmap. + * + * - The Type~1 driver will not be able to synthesize a Unicode charmap + * out of the glyphs found in the fonts. + * + * You would normally undefine this configuration macro when building a + * version of FreeType that doesn't contain a Type~1 or CFF driver. + */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /************************************************************************** + * + * Postscript Names to Unicode Values support + * + * By default, FreeType~2 is built with the 'psnames' module compiled in. + * Among other things, the module is used to convert a glyph name into a + * Unicode value. This is especially useful in order to synthesize on + * the fly a Unicode charmap from the CFF/Type~1 driver through a big + * table named the 'Adobe Glyph List' (AGL). + * + * Undefine this macro if you do not want the Adobe Glyph List compiled + * in your 'psnames' module. The Type~1 driver will not be able to + * synthesize a Unicode charmap out of the glyphs found in the fonts. + */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /************************************************************************** + * + * Support for Mac fonts + * + * Define this macro if you want support for outline fonts in Mac format + * (mac dfont, mac resource, macbinary containing a mac resource) on + * non-Mac platforms. + * + * Note that the 'FOND' resource isn't checked. + */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /************************************************************************** + * + * Guessing methods to access embedded resource forks + * + * Enable extra Mac fonts support on non-Mac platforms (e.g., GNU/Linux). + * + * Resource forks which include fonts data are stored sometimes in + * locations which users or developers don't expected. In some cases, + * resource forks start with some offset from the head of a file. In + * other cases, the actual resource fork is stored in file different from + * what the user specifies. If this option is activated, FreeType tries + * to guess whether such offsets or different file names must be used. + * + * Note that normal, direct access of resource forks is controlled via + * the `FT_CONFIG_OPTION_MAC_FONTS` option. + */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /************************************************************************** + * + * Allow the use of `FT_Incremental_Interface` to load typefaces that + * contain no glyph data, but supply it via a callback function. This is + * required by clients supporting document formats which supply font data + * incrementally as the document is parsed, such as the Ghostscript + * interpreter for the PostScript language. + */ +#define FT_CONFIG_OPTION_INCREMENTAL + + + /************************************************************************** + * + * The size in bytes of the render pool used by the scan-line converter to + * do all of its work. + */ +#define FT_RENDER_POOL_SIZE 16384L + + + /************************************************************************** + * + * FT_MAX_MODULES + * + * The maximum number of modules that can be registered in a single + * FreeType library object. 32~is the default. + */ +#define FT_MAX_MODULES 32 + + + /************************************************************************** + * + * Debug level + * + * FreeType can be compiled in debug or trace mode. In debug mode, + * errors are reported through the 'ftdebug' component. In trace mode, + * additional messages are sent to the standard output during execution. + * + * Define `FT_DEBUG_LEVEL_ERROR` to build the library in debug mode. + * Define `FT_DEBUG_LEVEL_TRACE` to build it in trace mode. + * + * Don't define any of these macros to compile in 'release' mode! + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + + /************************************************************************** + * + * Logging + * + * Compiling FreeType in debug or trace mode makes FreeType write error + * and trace log messages to `stderr`. Enabling this macro + * automatically forces the `FT_DEBUG_LEVEL_ERROR` and + * `FT_DEBUG_LEVEL_TRACE` macros and allows FreeType to write error and + * trace log messages to a file instead of `stderr`. For writing logs + * to a file, FreeType uses an the external `dlg` library (the source + * code is in `src/dlg`). + * + * This option needs a C99 compiler. + */ +/* #define FT_DEBUG_LOGGING */ + + + /************************************************************************** + * + * Autofitter debugging + * + * If `FT_DEBUG_AUTOFIT` is defined, FreeType provides some means to + * control the autofitter behaviour for debugging purposes with global + * boolean variables (consequently, you should **never** enable this + * while compiling in 'release' mode): + * + * ``` + * _af_debug_disable_horz_hints + * _af_debug_disable_vert_hints + * _af_debug_disable_blue_hints + * ``` + * + * Additionally, the following functions provide dumps of various + * internal autofit structures to stdout (using `printf`): + * + * ``` + * af_glyph_hints_dump_points + * af_glyph_hints_dump_segments + * af_glyph_hints_dump_edges + * af_glyph_hints_get_num_segments + * af_glyph_hints_get_segment_offset + * ``` + * + * As an argument, they use another global variable: + * + * ``` + * _af_debug_hints + * ``` + * + * Please have a look at the `ftgrid` demo program to see how those + * variables and macros should be used. + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_AUTOFIT */ + + + /************************************************************************** + * + * Memory Debugging + * + * FreeType now comes with an integrated memory debugger that is capable + * of detecting simple errors like memory leaks or double deletes. To + * compile it within your build of the library, you should define + * `FT_DEBUG_MEMORY` here. + * + * Note that the memory debugger is only activated at runtime when when + * the _environment_ variable `FT2_DEBUG_MEMORY` is defined also! + * + * Do not `#undef` this macro here since the build system might define it + * for certain configurations only. + */ +/* #define FT_DEBUG_MEMORY */ + + + /************************************************************************** + * + * Module errors + * + * If this macro is set (which is _not_ the default), the higher byte of + * an error code gives the module in which the error has occurred, while + * the lower byte is the real error code. + * + * Setting this macro makes sense for debugging purposes only, since it + * would break source compatibility of certain programs that use + * FreeType~2. + * + * More details can be found in the files `ftmoderr.h` and `fterrors.h`. + */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + /************************************************************************** + * + * Error Strings + * + * If this macro is set, `FT_Error_String` will return meaningful + * descriptions. This is not enabled by default to reduce the overall + * size of FreeType. + * + * More details can be found in the file `fterrors.h`. + */ +/* #define FT_CONFIG_OPTION_ERROR_STRINGS */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_EMBEDDED_BITMAPS` if you want to support + * embedded bitmaps in all formats using the 'sfnt' module (namely + * TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_COLOR_LAYERS` if you want to support colored + * outlines (from the 'COLR'/'CPAL' tables) in all formats using the 'sfnt' + * module (namely TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_COLOR_LAYERS + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_POSTSCRIPT_NAMES` if you want to be able to + * load and enumerate the glyph Postscript names in a TrueType or OpenType + * file. + * + * Note that when you do not compile the 'psnames' module by undefining the + * above `FT_CONFIG_OPTION_POSTSCRIPT_NAMES`, the 'sfnt' module will + * contain additional code used to read the PS Names table from a font. + * + * (By default, the module uses 'psnames' to extract glyph names.) + */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_SFNT_NAMES` if your applications need to access + * the internal name table in a SFNT-based format like TrueType or + * OpenType. The name table contains various strings used to describe the + * font, like family name, copyright, version, etc. It does not contain + * any glyph name though. + * + * Accessing SFNT names is done through the functions declared in + * `ftsnames.h`. + */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /************************************************************************** + * + * TrueType CMap support + * + * Here you can fine-tune which TrueType CMap table format shall be + * supported. + */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` if you want to compile a + * bytecode interpreter in the TrueType driver. + * + * By undefining this, you will only compile the code necessary to load + * TrueType glyphs without hinting. + * + * Do not `#undef` this macro here, since the build system might define it + * for certain configurations only. + */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_SUBPIXEL_HINTING` if you want to compile + * subpixel hinting support into the TrueType driver. This modifies the + * TrueType hinting mechanism when anything but `FT_RENDER_MODE_MONO` is + * requested. + * + * In particular, it modifies the bytecode interpreter to interpret (or + * not) instructions in a certain way so that all TrueType fonts look like + * they do in a Windows ClearType (DirectWrite) environment. See [1] for a + * technical overview on what this means. See `ttinterp.h` for more + * details on the LEAN option. + * + * There are three possible values. + * + * Value 1: + * This value is associated with the 'Infinality' moniker, contributed by + * an individual nicknamed Infinality with the goal of making TrueType + * fonts render better than on Windows. A high amount of configurability + * and flexibility, down to rules for single glyphs in fonts, but also + * very slow. Its experimental and slow nature and the original + * developer losing interest meant that this option was never enabled in + * default builds. + * + * The corresponding interpreter version is v38. + * + * Value 2: + * The new default mode for the TrueType driver. The Infinality code + * base was stripped to the bare minimum and all configurability removed + * in the name of speed and simplicity. The configurability was mainly + * aimed at legacy fonts like 'Arial', 'Times New Roman', or 'Courier'. + * Legacy fonts are fonts that modify vertical stems to achieve clean + * black-and-white bitmaps. The new mode focuses on applying a minimal + * set of rules to all fonts indiscriminately so that modern and web + * fonts render well while legacy fonts render okay. + * + * The corresponding interpreter version is v40. + * + * Value 3: + * Compile both, making both v38 and v40 available (the latter is the + * default). + * + * By undefining these, you get rendering behavior like on Windows without + * ClearType, i.e., Windows XP without ClearType enabled and Win9x + * (interpreter version v35). Or not, depending on how much hinting blood + * and testing tears the font designer put into a given font. If you + * define one or both subpixel hinting options, you can switch between + * between v35 and the ones you define (using `FT_Property_Set`). + * + * This option requires `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` to be + * defined. + * + * [1] + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx + */ +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */ + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED` to compile the + * TrueType glyph loader to use Apple's definition of how to handle + * component offsets in composite glyphs. + * + * Apple and MS disagree on the default behavior of component offsets in + * composites. Apple says that they should be scaled by the scaling + * factors in the transformation matrix (roughly, it's more complex) while + * MS says they should not. OpenType defines two bits in the composite + * flags array which can be used to disambiguate, but old fonts will not + * have them. + * + * https://www.microsoft.com/typography/otspec/glyf.htm + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html + */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_GX_VAR_SUPPORT` if you want to include support + * for Apple's distortable font technology ('fvar', 'gvar', 'cvar', and + * 'avar' tables). Tagged 'Font Variations', this is now part of OpenType + * also. This has many similarities to Type~1 Multiple Masters support. + */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an + * embedded 'BDF~' table within SFNT-based bitmap formats. + */ +#define TT_CONFIG_OPTION_BDF + + + /************************************************************************** + * + * Option `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES` controls the maximum + * number of bytecode instructions executed for a single run of the + * bytecode interpreter, needed to prevent infinite loops. You don't want + * to change this except for very special situations (e.g., making a + * library fuzzer spend less time to handle broken fonts). + * + * It is not expected that this value is ever modified by a configuring + * script; instead, it gets surrounded with `#ifndef ... #endif` so that + * the value can be set as a preprocessor option on the compiler's command + * line. + */ +#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES +#define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES 1000000L +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * `T1_MAX_DICT_DEPTH` is the maximum depth of nest dictionaries and arrays + * in the Type~1 stream (see `t1load.c`). A minimum of~4 is required. + */ +#define T1_MAX_DICT_DEPTH 5 + + + /************************************************************************** + * + * `T1_MAX_SUBRS_CALLS` details the maximum number of nested sub-routine + * calls during glyph loading. + */ +#define T1_MAX_SUBRS_CALLS 16 + + + /************************************************************************** + * + * `T1_MAX_CHARSTRING_OPERANDS` is the charstring stack's capacity. A + * minimum of~16 is required. + * + * The Chinese font 'MingTiEG-Medium' (covering the CNS 11643 character + * set) needs 256. + */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the 't1afm' module, which is in charge of reading Type~1 AFM files + * into an existing face. Note that if set, the Type~1 driver will be + * unable to produce kerning distances. + */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the Multiple Masters font support in the Type~1 driver. + */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /************************************************************************** + * + * `T1_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe Type~1 + * engine gets compiled into FreeType. If defined, it is possible to + * switch between the two engines using the `hinting-engine` property of + * the 'type1' driver module. + */ +/* #define T1_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** C F F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Using `CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}` it is + * possible to set up the default values of the four control points that + * define the stem darkening behaviour of the (new) CFF engine. For more + * details please read the documentation of the `darkening-parameters` + * property (file `ftdriver.h`), which allows the control at run-time. + * + * Do **not** undefine these macros! + */ +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 500 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 400 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 1000 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 1667 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 2333 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 0 + + + /************************************************************************** + * + * `CFF_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe CFF engine + * gets compiled into FreeType. If defined, it is possible to switch + * between the two engines using the `hinting-engine` property of the 'cff' + * driver module. + */ +/* #define CFF_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** P C F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * There are many PCF fonts just called 'Fixed' which look completely + * different, and which have nothing to do with each other. When selecting + * 'Fixed' in KDE or Gnome one gets results that appear rather random, the + * style changes often if one changes the size and one cannot select some + * fonts at all. This option makes the 'pcf' module prepend the foundry + * name (plus a space) to the family name. + * + * We also check whether we have 'wide' characters; all put together, we + * get family names like 'Sony Fixed' or 'Misc Fixed Wide'. + * + * If this option is activated, it can be controlled with the + * `no-long-family-names` property of the 'pcf' driver module. + */ +/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Compile 'autofit' module with CJK (Chinese, Japanese, Korean) script + * support. + */ +#define AF_CONFIG_OPTION_CJK + + + /************************************************************************** + * + * Compile 'autofit' module with fallback Indic script support, covering + * some scripts that the 'latin' submodule of the 'autofit' module doesn't + * (yet) handle. Currently, this needs option `AF_CONFIG_OPTION_CJK`. + */ +#ifdef AF_CONFIG_OPTION_CJK +#define AF_CONFIG_OPTION_INDIC +#endif + + + /************************************************************************** + * + * Use TrueType-like size metrics for 'light' auto-hinting. + * + * It is strongly recommended to avoid this option, which exists only to + * help some legacy applications retain its appearance and behaviour with + * respect to auto-hinted TrueType fonts. + * + * The very reason this option exists at all are GNU/Linux distributions + * like Fedora that did not un-patch the following change (which was + * present in FreeType between versions 2.4.6 and 2.7.1, inclusive). + * + * ``` + * 2011-07-16 Steven Chu + * + * [truetype] Fix metrics on size request for scalable fonts. + * ``` + * + * This problematic commit is now reverted (more or less). + */ +/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */ + + /* */ + + + /* + * This macro is obsolete. Support has been removed in FreeType version + * 2.5. + */ +/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* + * The next three macros are defined if native TrueType hinting is + * requested by the definitions above. Don't change this. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER + +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING +#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1 +#define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY +#endif + +#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2 +#define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#endif +#endif +#endif + + + /* + * The TT_SUPPORT_COLRV1 macro is defined to indicate to clients that this + * version of FreeType has support for 'COLR' v1 API. This definition is + * useful to FreeType clients that want to build in support for 'COLR' v1 + * depending on a tip-of-tree checkout before it is officially released in + * FreeType, and while the feature cannot yet be tested against using + * version macros. Don't change this macro. This may be removed once the + * feature is in a FreeType release version and version macros can be used + * to test for availability. + */ +#ifdef TT_CONFIG_OPTION_COLOR_LAYERS +#define TT_SUPPORT_COLRV1 +#endif + + + /* + * Check CFF darkening parameters. The checks are the same as in function + * `cff_property_set` in file `cffdrivr.c`. + */ +#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500 +#error "Invalid CFF darkening parameters!" +#endif + +FT_END_HEADER + + +#endif /* FTOPTION_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/config/ftstdlib.h b/NothinFancy/dep/include/freetype/config/ftstdlib.h new file mode 100644 index 0000000..fea21ff --- /dev/null +++ b/NothinFancy/dep/include/freetype/config/ftstdlib.h @@ -0,0 +1,175 @@ +/**************************************************************************** + * + * ftstdlib.h + * + * ANSI-specific library and header configuration file (specification + * only). + * + * Copyright (C) 2002-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to group all `#includes` to the ANSI~C library that + * FreeType normally requires. It also defines macros to rename the + * standard functions within the FreeType source code. + * + * Load a file which defines `FTSTDLIB_H_` before this one to override it. + * + */ + + +#ifndef FTSTDLIB_H_ +#define FTSTDLIB_H_ + + +#include + +#define ft_ptrdiff_t ptrdiff_t + + + /************************************************************************** + * + * integer limits + * + * `UINT_MAX` and `ULONG_MAX` are used to automatically compute the size of + * `int` and `long` in bytes at compile-time. So far, this works for all + * platforms the library has been tested on. + * + * Note that on the extremely rare platforms that do not provide integer + * types that are _exactly_ 16 and 32~bits wide (e.g., some old Crays where + * `int` is 36~bits), we do not make any guarantee about the correct + * behaviour of FreeType~2 with all fonts. + * + * In these cases, `ftconfig.h` will refuse to compile anyway with a + * message like 'couldn't find 32-bit type' or something similar. + * + */ + + +#include + +#define FT_CHAR_BIT CHAR_BIT +#define FT_USHORT_MAX USHRT_MAX +#define FT_INT_MAX INT_MAX +#define FT_INT_MIN INT_MIN +#define FT_UINT_MAX UINT_MAX +#define FT_LONG_MIN LONG_MIN +#define FT_LONG_MAX LONG_MAX +#define FT_ULONG_MAX ULONG_MAX + + + /************************************************************************** + * + * character and string processing + * + */ + + +#include + +#define ft_memchr memchr +#define ft_memcmp memcmp +#define ft_memcpy memcpy +#define ft_memmove memmove +#define ft_memset memset +#define ft_strcat strcat +#define ft_strcmp strcmp +#define ft_strcpy strcpy +#define ft_strlen strlen +#define ft_strncmp strncmp +#define ft_strncpy strncpy +#define ft_strrchr strrchr +#define ft_strstr strstr + + + /************************************************************************** + * + * file handling + * + */ + + +#include + +#define FT_FILE FILE +#define ft_fclose fclose +#define ft_fopen fopen +#define ft_fread fread +#define ft_fseek fseek +#define ft_ftell ftell +#define ft_sprintf sprintf + + + /************************************************************************** + * + * sorting + * + */ + + +#include + +#define ft_qsort qsort + + + /************************************************************************** + * + * memory allocation + * + */ + + +#define ft_scalloc calloc +#define ft_sfree free +#define ft_smalloc malloc +#define ft_srealloc realloc + + + /************************************************************************** + * + * miscellaneous + * + */ + + +#define ft_strtol strtol +#define ft_getenv getenv + + + /************************************************************************** + * + * execution control + * + */ + + +#include + +#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ + /* `jmp_buf` is defined as a macro */ + /* on certain platforms */ + +#define ft_longjmp longjmp +#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */ + + + /* The following is only used for debugging purposes, i.e., if */ + /* `FT_DEBUG_LEVEL_ERROR` or `FT_DEBUG_LEVEL_TRACE` are defined. */ + +#include + + +#endif /* FTSTDLIB_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/config/integer-types.h b/NothinFancy/dep/include/freetype/config/integer-types.h new file mode 100644 index 0000000..4bb3eed --- /dev/null +++ b/NothinFancy/dep/include/freetype/config/integer-types.h @@ -0,0 +1,245 @@ +/**************************************************************************** + * + * config/integer-types.h + * + * FreeType integer types definitions. + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ +#ifndef FREETYPE_CONFIG_INTEGER_TYPES_H_ +#define FREETYPE_CONFIG_INTEGER_TYPES_H_ + + /* There are systems (like the Texas Instruments 'C54x) where a `char` */ + /* has 16~bits. ANSI~C says that `sizeof(char)` is always~1. Since an */ + /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT` (defined in `limits.h`) gives the number of bits in a */ + /* `char` type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + +#ifndef FT_SIZEOF_INT + + /* The size of an `int` type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT ( 16 / FT_CHAR_BIT ) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT ( 32 / FT_CHAR_BIT ) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT ( 64 / FT_CHAR_BIT ) +#else +#error "Unsupported size of `int' type!" +#endif + +#endif /* !defined(FT_SIZEOF_INT) */ + +#ifndef FT_SIZEOF_LONG + + /* The size of a `long` type. A five-byte `long` (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG ( 64 / FT_CHAR_BIT ) +#else +#error "Unsupported size of `long' type!" +#endif + +#endif /* !defined(FT_SIZEOF_LONG) */ + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @type: + * FT_Int16 + * + * @description: + * A typedef for a 16bit signed integer type. + */ + typedef signed short FT_Int16; + + + /************************************************************************** + * + * @type: + * FT_UInt16 + * + * @description: + * A typedef for a 16bit unsigned integer type. + */ + typedef unsigned short FT_UInt16; + + /* */ + + + /* this #if 0 ... #endif clause is for documentation purposes */ +#if 0 + + /************************************************************************** + * + * @type: + * FT_Int32 + * + * @description: + * A typedef for a 32bit signed integer type. The size depends on the + * configuration. + */ + typedef signed XXX FT_Int32; + + + /************************************************************************** + * + * @type: + * FT_UInt32 + * + * A typedef for a 32bit unsigned integer type. The size depends on the + * configuration. + */ + typedef unsigned XXX FT_UInt32; + + + /************************************************************************** + * + * @type: + * FT_Int64 + * + * A typedef for a 64bit signed integer type. The size depends on the + * configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ + typedef signed XXX FT_Int64; + + + /************************************************************************** + * + * @type: + * FT_UInt64 + * + * A typedef for a 64bit unsigned integer type. The size depends on the + * configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ + typedef unsigned XXX FT_UInt64; + + /* */ + +#endif + +#if FT_SIZEOF_INT == ( 32 / FT_CHAR_BIT ) + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == ( 32 / FT_CHAR_BIT ) + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32~bits */ +#if FT_SIZEOF_INT >= ( 32 / FT_CHAR_BIT ) + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= ( 32 / FT_CHAR_BIT ) + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit `int` type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == ( 64 / FT_CHAR_BIT ) + + /* `FT_LONG64` must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long +#define FT_UINT64 unsigned long + + /************************************************************************** + * + * A 64-bit data type may create compilation problems if you compile in + * strict ANSI mode. To avoid them, we disable other 64-bit data types if + * `__STDC__` is defined. You can however ignore this rule by defining the + * `FT_CONFIG_OPTION_FORCE_INT64` configuration macro. + */ +#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L + +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the `__int64` type */ +#define FT_LONG64 +#define FT_INT64 __int64 +#define FT_UINT64 unsigned __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of `__BORLANDC__` in order */ + /* to test the compiler version. */ + + /* this compiler provides the `__int64` type */ +#define FT_LONG64 +#define FT_INT64 __int64 +#define FT_UINT64 unsigned __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long` type */ +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#endif /* __STDC_VERSION__ >= 199901L */ + +#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ + +#ifdef FT_LONG64 + typedef FT_INT64 FT_Int64; + typedef FT_UINT64 FT_UInt64; +#endif + + +#endif /* FREETYPE_CONFIG_INTEGER_TYPES_H_ */ diff --git a/NothinFancy/dep/include/freetype/config/mac-support.h b/NothinFancy/dep/include/freetype/config/mac-support.h new file mode 100644 index 0000000..ef58d8b --- /dev/null +++ b/NothinFancy/dep/include/freetype/config/mac-support.h @@ -0,0 +1,49 @@ +/**************************************************************************** + * + * config/mac-support.h + * + * Mac/OS X support configuration header. + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ +#ifndef FREETYPE_CONFIG_MAC_SUPPORT_H_ +#define FREETYPE_CONFIG_MAC_SUPPORT_H_ + + /************************************************************************** + * + * Mac support + * + * This is the only necessary change, so it is defined here instead + * providing a new configuration file. + */ +#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* No Carbon frameworks for 64bit 10.4.x. */ + /* `AvailabilityMacros.h` is available since Mac OS X 10.2, */ + /* so guess the system version by maximum errno before inclusion. */ +#include +#ifdef ECANCELED /* defined since 10.2 */ +#include "AvailabilityMacros.h" +#endif +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#undef FT_MACINTOSH +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif /* Mac support */ + +#endif /* FREETYPE_CONFIG_MAC_SUPPORT_H_ */ diff --git a/NothinFancy/dep/include/freetype/config/public-macros.h b/NothinFancy/dep/include/freetype/config/public-macros.h new file mode 100644 index 0000000..fed414e --- /dev/null +++ b/NothinFancy/dep/include/freetype/config/public-macros.h @@ -0,0 +1,120 @@ +/**************************************************************************** + * + * config/public-macros.h + * + * Define a set of compiler macros used in public FreeType headers. + * + * Copyright (C) 2020-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /* + * The definitions in this file are used by the public FreeType headers + * and thus should be considered part of the public API. + * + * Other compiler-specific macro definitions that are not exposed by the + * FreeType API should go into + * `include/freetype/internal/compiler-macros.h` instead. + */ +#ifndef FREETYPE_CONFIG_PUBLIC_MACROS_H_ +#define FREETYPE_CONFIG_PUBLIC_MACROS_H_ + + /* + * `FT_BEGIN_HEADER` and `FT_END_HEADER` might have already been defined + * by `freetype/config/ftheader.h`, but we don't want to include this + * header here, so redefine the macros here only when needed. Their + * definition is very stable, so keeping them in sync with the ones in the + * header should not be a maintenance issue. + */ +#ifndef FT_BEGIN_HEADER +#ifdef __cplusplus +#define FT_BEGIN_HEADER extern "C" { +#else +#define FT_BEGIN_HEADER /* empty */ +#endif +#endif /* FT_BEGIN_HEADER */ + +#ifndef FT_END_HEADER +#ifdef __cplusplus +#define FT_END_HEADER } +#else +#define FT_END_HEADER /* empty */ +#endif +#endif /* FT_END_HEADER */ + + +FT_BEGIN_HEADER + + /* + * Mark a function declaration as public. This ensures it will be + * properly exported to client code. Place this before a function + * declaration. + * + * NOTE: This macro should be considered an internal implementation + * detail, and not part of the FreeType API. It is only defined here + * because it is needed by `FT_EXPORT`. + */ + + /* Visual C, mingw */ +#if defined( WIN32 ) + +#if defined( FT2_BUILD_LIBRARY ) && defined( DLL_EXPORT ) +#define FT_PUBLIC_FUNCTION_ATTRIBUTE __declspec( dllexport ) +#elif defined( DLL_IMPORT ) +#define FT_PUBLIC_FUNCTION_ATTRIBUTE __declspec( dllimport ) +#endif + + /* gcc, clang */ +#elif ( defined( __GNUC__ ) && __GNUC__ >= 4 ) || defined( __clang__ ) +#define FT_PUBLIC_FUNCTION_ATTRIBUTE \ + __attribute__(( visibility( "default" ) )) + + /* Sun */ +#elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 +#define FT_PUBLIC_FUNCTION_ATTRIBUTE __global +#endif + + +#ifndef FT_PUBLIC_FUNCTION_ATTRIBUTE +#define FT_PUBLIC_FUNCTION_ATTRIBUTE /* empty */ +#endif + + + /* + * Define a public FreeType API function. This ensures it is properly + * exported or imported at build time. The macro parameter is the + * function's return type as in: + * + * FT_EXPORT( FT_Bool ) + * FT_Object_Method( FT_Object obj, + * ... ); + * + * NOTE: This requires that all `FT_EXPORT` uses are inside + * `FT_BEGIN_HEADER ... FT_END_HEADER` blocks. This guarantees that the + * functions are exported with C linkage, even when the header is included + * by a C++ source file. + */ +#define FT_EXPORT( x ) FT_PUBLIC_FUNCTION_ATTRIBUTE extern x + + /* + * `FT_UNUSED` indicates that a given parameter is not used -- this is + * only used to get rid of unpleasant compiler warnings. + * + * Technically, this was not meant to be part of the public API, but some + * third-party code depends on it. + */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + +FT_END_HEADER + +#endif /* FREETYPE_CONFIG_PUBLIC_MACROS_H_ */ diff --git a/NothinFancy/dep/include/freetype/freetype.h b/NothinFancy/dep/include/freetype/freetype.h new file mode 100644 index 0000000..77fede3 --- /dev/null +++ b/NothinFancy/dep/include/freetype/freetype.h @@ -0,0 +1,4833 @@ +/**************************************************************************** + * + * freetype.h + * + * FreeType high-level API and common types (specification only). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FREETYPE_H_ +#define FREETYPE_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include +#include + + +FT_BEGIN_HEADER + + + + /************************************************************************** + * + * @section: + * preamble + * + * @title: + * Preamble + * + * @abstract: + * What FreeType is and isn't + * + * @description: + * FreeType is a library that provides access to glyphs in font files. It + * scales the glyph images and their metrics to a requested size, and it + * rasterizes the glyph images to produce pixel or subpixel alpha coverage + * bitmaps. + * + * Note that FreeType is _not_ a text layout engine. You have to use + * higher-level libraries like HarfBuzz, Pango, or ICU for that. + * + * Note also that FreeType does _not_ perform alpha blending or + * compositing the resulting bitmaps or pixmaps by itself. Use your + * favourite graphics library (for example, Cairo or Skia) to further + * process FreeType's output. + * + */ + + + /************************************************************************** + * + * @section: + * header_inclusion + * + * @title: + * FreeType's header inclusion scheme + * + * @abstract: + * How client applications should include FreeType header files. + * + * @description: + * To be as flexible as possible (and for historical reasons), you must + * load file `ft2build.h` first before other header files, for example + * + * ``` + * #include + * + * #include + * #include + * ``` + */ + + + /************************************************************************** + * + * @section: + * user_allocation + * + * @title: + * User allocation + * + * @abstract: + * How client applications should allocate FreeType data structures. + * + * @description: + * FreeType assumes that structures allocated by the user and passed as + * arguments are zeroed out except for the actual data. In other words, + * it is recommended to use `calloc` (or variants of it) instead of + * `malloc` for allocation. + * + */ + + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * base_interface + * + * @title: + * Base Interface + * + * @abstract: + * The FreeType~2 base font interface. + * + * @description: + * This section describes the most important public high-level API + * functions of FreeType~2. + * + * @order: + * FT_Library + * FT_Face + * FT_Size + * FT_GlyphSlot + * FT_CharMap + * FT_Encoding + * FT_ENC_TAG + * + * FT_FaceRec + * + * FT_FACE_FLAG_SCALABLE + * FT_FACE_FLAG_FIXED_SIZES + * FT_FACE_FLAG_FIXED_WIDTH + * FT_FACE_FLAG_HORIZONTAL + * FT_FACE_FLAG_VERTICAL + * FT_FACE_FLAG_COLOR + * FT_FACE_FLAG_SFNT + * FT_FACE_FLAG_CID_KEYED + * FT_FACE_FLAG_TRICKY + * FT_FACE_FLAG_KERNING + * FT_FACE_FLAG_MULTIPLE_MASTERS + * FT_FACE_FLAG_VARIATION + * FT_FACE_FLAG_GLYPH_NAMES + * FT_FACE_FLAG_EXTERNAL_STREAM + * FT_FACE_FLAG_HINTER + * + * FT_HAS_HORIZONTAL + * FT_HAS_VERTICAL + * FT_HAS_KERNING + * FT_HAS_FIXED_SIZES + * FT_HAS_GLYPH_NAMES + * FT_HAS_COLOR + * FT_HAS_MULTIPLE_MASTERS + * + * FT_IS_SFNT + * FT_IS_SCALABLE + * FT_IS_FIXED_WIDTH + * FT_IS_CID_KEYED + * FT_IS_TRICKY + * FT_IS_NAMED_INSTANCE + * FT_IS_VARIATION + * + * FT_STYLE_FLAG_BOLD + * FT_STYLE_FLAG_ITALIC + * + * FT_SizeRec + * FT_Size_Metrics + * + * FT_GlyphSlotRec + * FT_Glyph_Metrics + * FT_SubGlyph + * + * FT_Bitmap_Size + * + * FT_Init_FreeType + * FT_Done_FreeType + * + * FT_New_Face + * FT_Done_Face + * FT_Reference_Face + * FT_New_Memory_Face + * FT_Face_Properties + * FT_Open_Face + * FT_Open_Args + * FT_Parameter + * FT_Attach_File + * FT_Attach_Stream + * + * FT_Set_Char_Size + * FT_Set_Pixel_Sizes + * FT_Request_Size + * FT_Select_Size + * FT_Size_Request_Type + * FT_Size_RequestRec + * FT_Size_Request + * FT_Set_Transform + * FT_Get_Transform + * FT_Load_Glyph + * FT_Get_Char_Index + * FT_Get_First_Char + * FT_Get_Next_Char + * FT_Get_Name_Index + * FT_Load_Char + * + * FT_OPEN_MEMORY + * FT_OPEN_STREAM + * FT_OPEN_PATHNAME + * FT_OPEN_DRIVER + * FT_OPEN_PARAMS + * + * FT_LOAD_DEFAULT + * FT_LOAD_RENDER + * FT_LOAD_MONOCHROME + * FT_LOAD_LINEAR_DESIGN + * FT_LOAD_NO_SCALE + * FT_LOAD_NO_HINTING + * FT_LOAD_NO_BITMAP + * FT_LOAD_NO_AUTOHINT + * FT_LOAD_COLOR + * + * FT_LOAD_VERTICAL_LAYOUT + * FT_LOAD_IGNORE_TRANSFORM + * FT_LOAD_FORCE_AUTOHINT + * FT_LOAD_NO_RECURSE + * FT_LOAD_PEDANTIC + * + * FT_LOAD_TARGET_NORMAL + * FT_LOAD_TARGET_LIGHT + * FT_LOAD_TARGET_MONO + * FT_LOAD_TARGET_LCD + * FT_LOAD_TARGET_LCD_V + * + * FT_LOAD_TARGET_MODE + * + * FT_Render_Glyph + * FT_Render_Mode + * FT_Get_Kerning + * FT_Kerning_Mode + * FT_Get_Track_Kerning + * FT_Get_Glyph_Name + * FT_Get_Postscript_Name + * + * FT_CharMapRec + * FT_Select_Charmap + * FT_Set_Charmap + * FT_Get_Charmap_Index + * + * FT_Get_FSType_Flags + * FT_Get_SubGlyph_Info + * + * FT_Face_Internal + * FT_Size_Internal + * FT_Slot_Internal + * + * FT_FACE_FLAG_XXX + * FT_STYLE_FLAG_XXX + * FT_OPEN_XXX + * FT_LOAD_XXX + * FT_LOAD_TARGET_XXX + * FT_SUBGLYPH_FLAG_XXX + * FT_FSTYPE_XXX + * + * FT_HAS_FAST_GLYPHS + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Glyph_Metrics + * + * @description: + * A structure to model the metrics of a single glyph. The values are + * expressed in 26.6 fractional pixel format; if the flag + * @FT_LOAD_NO_SCALE has been used while loading the glyph, values are + * expressed in font units instead. + * + * @fields: + * width :: + * The glyph's width. + * + * height :: + * The glyph's height. + * + * horiBearingX :: + * Left side bearing for horizontal layout. + * + * horiBearingY :: + * Top side bearing for horizontal layout. + * + * horiAdvance :: + * Advance width for horizontal layout. + * + * vertBearingX :: + * Left side bearing for vertical layout. + * + * vertBearingY :: + * Top side bearing for vertical layout. Larger positive values mean + * further below the vertical glyph origin. + * + * vertAdvance :: + * Advance height for vertical layout. Positive values mean the glyph + * has a positive advance downward. + * + * @note: + * If not disabled with @FT_LOAD_NO_HINTING, the values represent + * dimensions of the hinted glyph (in case hinting is applicable). + * + * Stroking a glyph with an outside border does not increase + * `horiAdvance` or `vertAdvance`; you have to manually adjust these + * values to account for the added width and height. + * + * FreeType doesn't use the 'VORG' table data for CFF fonts because it + * doesn't have an interface to quickly retrieve the glyph height. The + * y~coordinate of the vertical origin can be simply computed as + * `vertBearingY + height` after loading a glyph. + */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; + FT_Pos height; + + FT_Pos horiBearingX; + FT_Pos horiBearingY; + FT_Pos horiAdvance; + + FT_Pos vertBearingX; + FT_Pos vertBearingY; + FT_Pos vertAdvance; + + } FT_Glyph_Metrics; + + + /************************************************************************** + * + * @struct: + * FT_Bitmap_Size + * + * @description: + * This structure models the metrics of a bitmap strike (i.e., a set of + * glyphs for a given point size and resolution) in a bitmap font. It is + * used for the `available_sizes` field of @FT_Face. + * + * @fields: + * height :: + * The vertical distance, in pixels, between two consecutive baselines. + * It is always positive. + * + * width :: + * The average width, in pixels, of all glyphs in the strike. + * + * size :: + * The nominal size of the strike in 26.6 fractional points. This + * field is not very useful. + * + * x_ppem :: + * The horizontal ppem (nominal width) in 26.6 fractional pixels. + * + * y_ppem :: + * The vertical ppem (nominal height) in 26.6 fractional pixels. + * + * @note: + * Windows FNT: + * The nominal size given in a FNT font is not reliable. If the driver + * finds it incorrect, it sets `size` to some calculated values, and + * `x_ppem` and `y_ppem` to the pixel width and height given in the + * font, respectively. + * + * TrueType embedded bitmaps: + * `size`, `width`, and `height` values are not contained in the bitmap + * strike itself. They are computed from the global font parameters. + */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + FT_Pos size; + + FT_Pos x_ppem; + FT_Pos y_ppem; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @type: + * FT_Library + * + * @description: + * A handle to a FreeType library instance. Each 'library' is completely + * independent from the others; it is the 'root' of a set of objects like + * fonts, faces, sizes, etc. + * + * It also embeds a memory manager (see @FT_Memory), as well as a + * scan-line converter object (see @FT_Raster). + * + * [Since 2.5.6] In multi-threaded applications it is easiest to use one + * `FT_Library` object per thread. In case this is too cumbersome, a + * single `FT_Library` object across threads is possible also, as long as + * a mutex lock is used around @FT_New_Face and @FT_Done_Face. + * + * @note: + * Library objects are normally created by @FT_Init_FreeType, and + * destroyed with @FT_Done_FreeType. If you need reference-counting + * (cf. @FT_Reference_Library), use @FT_New_Library and @FT_Done_Library. + */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /************************************************************************** + * + * @section: + * module_management + * + */ + + /************************************************************************** + * + * @type: + * FT_Module + * + * @description: + * A handle to a given FreeType module object. A module can be a font + * driver, a renderer, or anything else that provides services to the + * former. + */ + typedef struct FT_ModuleRec_* FT_Module; + + + /************************************************************************** + * + * @type: + * FT_Driver + * + * @description: + * A handle to a given FreeType font driver object. A font driver is a + * module capable of creating faces from font files. + */ + typedef struct FT_DriverRec_* FT_Driver; + + + /************************************************************************** + * + * @type: + * FT_Renderer + * + * @description: + * A handle to a given FreeType renderer. A renderer is a module in + * charge of converting a glyph's outline image to a bitmap. It supports + * a single glyph image format, and one or more target surface depths. + */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /************************************************************************** + * + * @section: + * base_interface + * + */ + + /************************************************************************** + * + * @type: + * FT_Face + * + * @description: + * A handle to a typographic face object. A face object models a given + * typeface, in a given style. + * + * @note: + * A face object also owns a single @FT_GlyphSlot object, as well as one + * or more @FT_Size objects. + * + * Use @FT_New_Face or @FT_Open_Face to create a new face object from a + * given filepath or a custom input stream. + * + * Use @FT_Done_Face to destroy it (along with its slot and sizes). + * + * An `FT_Face` object can only be safely used from one thread at a time. + * Similarly, creation and destruction of `FT_Face` with the same + * @FT_Library object can only be done from one thread at a time. On the + * other hand, functions like @FT_Load_Glyph and its siblings are + * thread-safe and do not need the lock to be held as long as the same + * `FT_Face` object is not used from multiple threads at the same time. + * + * @also: + * See @FT_FaceRec for the publicly accessible fields of a given face + * object. + */ + typedef struct FT_FaceRec_* FT_Face; + + + /************************************************************************** + * + * @type: + * FT_Size + * + * @description: + * A handle to an object that models a face scaled to a given character + * size. + * + * @note: + * An @FT_Face has one _active_ @FT_Size object that is used by functions + * like @FT_Load_Glyph to determine the scaling transformation that in + * turn is used to load and hint glyphs and metrics. + * + * You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, @FT_Request_Size + * or even @FT_Select_Size to change the content (i.e., the scaling + * values) of the active @FT_Size. + * + * You can use @FT_New_Size to create additional size objects for a given + * @FT_Face, but they won't be used by other functions until you activate + * it through @FT_Activate_Size. Only one size can be activated at any + * given time per face. + * + * @also: + * See @FT_SizeRec for the publicly accessible fields of a given size + * object. + */ + typedef struct FT_SizeRec_* FT_Size; + + + /************************************************************************** + * + * @type: + * FT_GlyphSlot + * + * @description: + * A handle to a given 'glyph slot'. A slot is a container that can hold + * any of the glyphs contained in its parent face. + * + * In other words, each time you call @FT_Load_Glyph or @FT_Load_Char, + * the slot's content is erased by the new glyph data, i.e., the glyph's + * metrics, its image (bitmap or outline), and other control information. + * + * @also: + * See @FT_GlyphSlotRec for the publicly accessible glyph fields. + */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /************************************************************************** + * + * @type: + * FT_CharMap + * + * @description: + * A handle to a character map (usually abbreviated to 'charmap'). A + * charmap is used to translate character codes in a given encoding into + * glyph indexes for its parent's face. Some font formats may provide + * several charmaps per font. + * + * Each face object owns zero or more charmaps, but only one of them can + * be 'active', providing the data used by @FT_Get_Char_Index or + * @FT_Load_Char. + * + * The list of available charmaps in a face is available through the + * `face->num_charmaps` and `face->charmaps` fields of @FT_FaceRec. + * + * The currently active charmap is available as `face->charmap`. You + * should call @FT_Set_Charmap to change it. + * + * @note: + * When a new face is created (either through @FT_New_Face or + * @FT_Open_Face), the library looks for a Unicode charmap within the + * list and automatically activates it. If there is no Unicode charmap, + * FreeType doesn't set an 'active' charmap. + * + * @also: + * See @FT_CharMapRec for the publicly accessible fields of a given + * character map. + */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /************************************************************************** + * + * @macro: + * FT_ENC_TAG + * + * @description: + * This macro converts four-letter tags into an unsigned long. It is + * used to define 'encoding' identifiers (see @FT_Encoding). + * + * @note: + * Since many 16-bit compilers don't like 32-bit enumerations, you should + * redefine this macro in case of problems to something like this: + * + * ``` + * #define FT_ENC_TAG( value, a, b, c, d ) value + * ``` + * + * to get a simple enumeration without assigning special numbers. + */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) \ + value = ( ( (FT_UInt32)(a) << 24 ) | \ + ( (FT_UInt32)(b) << 16 ) | \ + ( (FT_UInt32)(c) << 8 ) | \ + (FT_UInt32)(d) ) + +#endif /* FT_ENC_TAG */ + + + /************************************************************************** + * + * @enum: + * FT_Encoding + * + * @description: + * An enumeration to specify character sets supported by charmaps. Used + * in the @FT_Select_Charmap API function. + * + * @note: + * Despite the name, this enumeration lists specific character + * repertories (i.e., charsets), and not text encoding methods (e.g., + * UTF-8, UTF-16, etc.). + * + * Other encodings might be defined in the future. + * + * @values: + * FT_ENCODING_NONE :: + * The encoding value~0 is reserved for all formats except BDF, PCF, + * and Windows FNT; see below for more information. + * + * FT_ENCODING_UNICODE :: + * The Unicode character set. This value covers all versions of the + * Unicode repertoire, including ASCII and Latin-1. Most fonts include + * a Unicode charmap, but not all of them. + * + * For example, if you want to access Unicode value U+1F028 (and the + * font contains it), use value 0x1F028 as the input value for + * @FT_Get_Char_Index. + * + * FT_ENCODING_MS_SYMBOL :: + * Microsoft Symbol encoding, used to encode mathematical symbols and + * wingdings. For more information, see + * 'https://www.microsoft.com/typography/otspec/recom.htm#non-standard-symbol-fonts', + * 'http://www.kostis.net/charsets/symbol.htm', and + * 'http://www.kostis.net/charsets/wingding.htm'. + * + * This encoding uses character codes from the PUA (Private Unicode + * Area) in the range U+F020-U+F0FF. + * + * FT_ENCODING_SJIS :: + * Shift JIS encoding for Japanese. More info at + * 'https://en.wikipedia.org/wiki/Shift_JIS'. See note on multi-byte + * encodings below. + * + * FT_ENCODING_PRC :: + * Corresponds to encoding systems mainly for Simplified Chinese as + * used in People's Republic of China (PRC). The encoding layout is + * based on GB~2312 and its supersets GBK and GB~18030. + * + * FT_ENCODING_BIG5 :: + * Corresponds to an encoding system for Traditional Chinese as used in + * Taiwan and Hong Kong. + * + * FT_ENCODING_WANSUNG :: + * Corresponds to the Korean encoding system known as Extended Wansung + * (MS Windows code page 949). For more information see + * 'https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt'. + * + * FT_ENCODING_JOHAB :: + * The Korean standard character set (KS~C 5601-1992), which + * corresponds to MS Windows code page 1361. This character set + * includes all possible Hangul character combinations. + * + * FT_ENCODING_ADOBE_LATIN_1 :: + * Corresponds to a Latin-1 encoding as defined in a Type~1 PostScript + * font. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_STANDARD :: + * Adobe Standard encoding, as found in Type~1, CFF, and OpenType/CFF + * fonts. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_EXPERT :: + * Adobe Expert encoding, as found in Type~1, CFF, and OpenType/CFF + * fonts. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_CUSTOM :: + * Corresponds to a custom encoding, as found in Type~1, CFF, and + * OpenType/CFF fonts. It is limited to 256 character codes. + * + * FT_ENCODING_APPLE_ROMAN :: + * Apple roman encoding. Many TrueType and OpenType fonts contain a + * charmap for this 8-bit encoding, since older versions of Mac OS are + * able to use it. + * + * FT_ENCODING_OLD_LATIN_2 :: + * This value is deprecated and was neither used nor reported by + * FreeType. Don't use or test for it. + * + * FT_ENCODING_MS_SJIS :: + * Same as FT_ENCODING_SJIS. Deprecated. + * + * FT_ENCODING_MS_GB2312 :: + * Same as FT_ENCODING_PRC. Deprecated. + * + * FT_ENCODING_MS_BIG5 :: + * Same as FT_ENCODING_BIG5. Deprecated. + * + * FT_ENCODING_MS_WANSUNG :: + * Same as FT_ENCODING_WANSUNG. Deprecated. + * + * FT_ENCODING_MS_JOHAB :: + * Same as FT_ENCODING_JOHAB. Deprecated. + * + * @note: + * By default, FreeType enables a Unicode charmap and tags it with + * `FT_ENCODING_UNICODE` when it is either provided or can be generated + * from PostScript glyph name dictionaries in the font file. All other + * encodings are considered legacy and tagged only if explicitly defined + * in the font file. Otherwise, `FT_ENCODING_NONE` is used. + * + * `FT_ENCODING_NONE` is set by the BDF and PCF drivers if the charmap is + * neither Unicode nor ISO-8859-1 (otherwise it is set to + * `FT_ENCODING_UNICODE`). Use @FT_Get_BDF_Charset_ID to find out which + * encoding is really present. If, for example, the `cs_registry` field + * is 'KOI8' and the `cs_encoding` field is 'R', the font is encoded in + * KOI8-R. + * + * `FT_ENCODING_NONE` is always set (with a single exception) by the + * winfonts driver. Use @FT_Get_WinFNT_Header and examine the `charset` + * field of the @FT_WinFNT_HeaderRec structure to find out which encoding + * is really present. For example, @FT_WinFNT_ID_CP1251 (204) means + * Windows code page 1251 (for Russian). + * + * `FT_ENCODING_NONE` is set if `platform_id` is @TT_PLATFORM_MACINTOSH + * and `encoding_id` is not `TT_MAC_ID_ROMAN` (otherwise it is set to + * `FT_ENCODING_APPLE_ROMAN`). + * + * If `platform_id` is @TT_PLATFORM_MACINTOSH, use the function + * @FT_Get_CMap_Language_ID to query the Mac language ID that may be + * needed to be able to distinguish Apple encoding variants. See + * + * https://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt + * + * to get an idea how to do that. Basically, if the language ID is~0, + * don't use it, otherwise subtract 1 from the language ID. Then examine + * `encoding_id`. If, for example, `encoding_id` is `TT_MAC_ID_ROMAN` + * and the language ID (minus~1) is `TT_MAC_LANGID_GREEK`, it is the + * Greek encoding, not Roman. `TT_MAC_ID_ARABIC` with + * `TT_MAC_LANGID_FARSI` means the Farsi variant the Arabic encoding. + */ + typedef enum FT_Encoding_ + { + FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), + + FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), + FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), + + FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), + FT_ENC_TAG( FT_ENCODING_PRC, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), + FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), + FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), + + /* for backward compatibility */ + FT_ENCODING_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + + FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), + + FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), + + FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /* these constants are deprecated; use the corresponding `FT_Encoding` */ + /* values instead */ +#define ft_encoding_none FT_ENCODING_NONE +#define ft_encoding_unicode FT_ENCODING_UNICODE +#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL +#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 +#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 +#define ft_encoding_sjis FT_ENCODING_SJIS +#define ft_encoding_gb2312 FT_ENCODING_PRC +#define ft_encoding_big5 FT_ENCODING_BIG5 +#define ft_encoding_wansung FT_ENCODING_WANSUNG +#define ft_encoding_johab FT_ENCODING_JOHAB + +#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD +#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT +#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM +#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN + + + /************************************************************************** + * + * @struct: + * FT_CharMapRec + * + * @description: + * The base charmap structure. + * + * @fields: + * face :: + * A handle to the parent face object. + * + * encoding :: + * An @FT_Encoding tag identifying the charmap. Use this with + * @FT_Select_Charmap. + * + * platform_id :: + * An ID number describing the platform for the following encoding ID. + * This comes directly from the TrueType specification and gets + * emulated for other formats. + * + * encoding_id :: + * A platform-specific encoding number. This also comes from the + * TrueType specification and gets emulated similarly. + */ + typedef struct FT_CharMapRec_ + { + FT_Face face; + FT_Encoding encoding; + FT_UShort platform_id; + FT_UShort encoding_id; + + } FT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S E O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FT_Face_Internal + * + * @description: + * An opaque handle to an `FT_Face_InternalRec` structure that models the + * private data of a given @FT_Face object. + * + * This structure might change between releases of FreeType~2 and is not + * generally available to client applications. + */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /************************************************************************** + * + * @struct: + * FT_FaceRec + * + * @description: + * FreeType root face class structure. A face object models a typeface + * in a font file. + * + * @fields: + * num_faces :: + * The number of faces in the font file. Some font formats can have + * multiple faces in a single font file. + * + * face_index :: + * This field holds two different values. Bits 0-15 are the index of + * the face in the font file (starting with value~0). They are set + * to~0 if there is only one face in the font file. + * + * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation + * fonts only, holding the named instance index for the current face + * index (starting with value~1; value~0 indicates font access without + * a named instance). For non-variation fonts, bits 16-30 are ignored. + * If we have the third named instance of face~4, say, `face_index` is + * set to 0x00030004. + * + * Bit 31 is always zero (this is, `face_index` is always a positive + * value). + * + * [Since 2.9] Changing the design coordinates with + * @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does + * not influence the named instance index value (only + * @FT_Set_Named_Instance does that). + * + * face_flags :: + * A set of bit flags that give important information about the face; + * see @FT_FACE_FLAG_XXX for the details. + * + * style_flags :: + * The lower 16~bits contain a set of bit flags indicating the style of + * the face; see @FT_STYLE_FLAG_XXX for the details. + * + * [Since 2.6.1] Bits 16-30 hold the number of named instances + * available for the current face if we have a GX or OpenType variation + * (sub)font. Bit 31 is always zero (this is, `style_flags` is always + * a positive value). Note that a variation font has always at least + * one named instance, namely the default instance. + * + * num_glyphs :: + * The number of glyphs in the face. If the face is scalable and has + * sbits (see `num_fixed_sizes`), it is set to the number of outline + * glyphs. + * + * For CID-keyed fonts (not in an SFNT wrapper) this value gives the + * highest CID used in the font. + * + * family_name :: + * The face's family name. This is an ASCII string, usually in + * English, that describes the typeface's family (like 'Times New + * Roman', 'Bodoni', 'Garamond', etc). This is a least common + * denominator used to list fonts. Some formats (TrueType & OpenType) + * provide localized and Unicode versions of this string. Applications + * should use the format-specific interface to access them. Can be + * `NULL` (e.g., in fonts embedded in a PDF file). + * + * In case the font doesn't provide a specific family name entry, + * FreeType tries to synthesize one, deriving it from other name + * entries. + * + * style_name :: + * The face's style name. This is an ASCII string, usually in English, + * that describes the typeface's style (like 'Italic', 'Bold', + * 'Condensed', etc). Not all font formats provide a style name, so + * this field is optional, and can be set to `NULL`. As for + * `family_name`, some formats provide localized and Unicode versions + * of this string. Applications should use the format-specific + * interface to access them. + * + * num_fixed_sizes :: + * The number of bitmap strikes in the face. Even if the face is + * scalable, there might still be bitmap strikes, which are called + * 'sbits' in that case. + * + * available_sizes :: + * An array of @FT_Bitmap_Size for all bitmap strikes in the face. It + * is set to `NULL` if there is no bitmap strike. + * + * Note that FreeType tries to sanitize the strike data since they are + * sometimes sloppy or incorrect, but this can easily fail. + * + * num_charmaps :: + * The number of charmaps in the face. + * + * charmaps :: + * An array of the charmaps of the face. + * + * generic :: + * A field reserved for client uses. See the @FT_Generic type + * description. + * + * bbox :: + * The font bounding box. Coordinates are expressed in font units (see + * `units_per_EM`). The box is large enough to contain any glyph from + * the font. Thus, `bbox.yMax` can be seen as the 'maximum ascender', + * and `bbox.yMin` as the 'minimum descender'. Only relevant for + * scalable formats. + * + * Note that the bounding box might be off by (at least) one pixel for + * hinted fonts. See @FT_Size_Metrics for further discussion. + * + * Note that the bounding box does not vary in OpenType variable fonts + * and should only be used in relation to the default instance. + * + * units_per_EM :: + * The number of font units per EM square for this face. This is + * typically 2048 for TrueType fonts, and 1000 for Type~1 fonts. Only + * relevant for scalable formats. + * + * ascender :: + * The typographic ascender of the face, expressed in font units. For + * font formats not having this information, it is set to `bbox.yMax`. + * Only relevant for scalable formats. + * + * descender :: + * The typographic descender of the face, expressed in font units. For + * font formats not having this information, it is set to `bbox.yMin`. + * Note that this field is negative for values below the baseline. + * Only relevant for scalable formats. + * + * height :: + * This value is the vertical distance between two consecutive + * baselines, expressed in font units. It is always positive. Only + * relevant for scalable formats. + * + * If you want the global glyph height, use `ascender - descender`. + * + * max_advance_width :: + * The maximum advance width, in font units, for all glyphs in this + * face. This can be used to make word wrapping computations faster. + * Only relevant for scalable formats. + * + * max_advance_height :: + * The maximum advance height, in font units, for all glyphs in this + * face. This is only relevant for vertical layouts, and is set to + * `height` for fonts that do not provide vertical metrics. Only + * relevant for scalable formats. + * + * underline_position :: + * The position, in font units, of the underline line for this face. + * It is the center of the underlining stem. Only relevant for + * scalable formats. + * + * underline_thickness :: + * The thickness, in font units, of the underline for this face. Only + * relevant for scalable formats. + * + * glyph :: + * The face's associated glyph slot(s). + * + * size :: + * The current active size for this face. + * + * charmap :: + * The current active charmap for this face. + * + * @note: + * Fields may be changed after a call to @FT_Attach_File or + * @FT_Attach_Stream. + * + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `ascender`, `descender`, `height`, + * `underline_position`, and `underline_thickness`. + * + * Especially for TrueType fonts see also the documentation for + * @FT_Size_Metrics. + */ + typedef struct FT_FaceRec_ + { + FT_Long num_faces; + FT_Long face_index; + + FT_Long face_flags; + FT_Long style_flags; + + FT_Long num_glyphs; + + FT_String* family_name; + FT_String* style_name; + + FT_Int num_fixed_sizes; + FT_Bitmap_Size* available_sizes; + + FT_Int num_charmaps; + FT_CharMap* charmaps; + + FT_Generic generic; + + /*# The following member variables (down to `underline_thickness`) */ + /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /*# for bitmap fonts. */ + FT_BBox bbox; + + FT_UShort units_per_EM; + FT_Short ascender; + FT_Short descender; + FT_Short height; + + FT_Short max_advance_width; + FT_Short max_advance_height; + + FT_Short underline_position; + FT_Short underline_thickness; + + FT_GlyphSlot glyph; + FT_Size size; + FT_CharMap charmap; + + /*@private begin */ + + FT_Driver driver; + FT_Memory memory; + FT_Stream stream; + + FT_ListRec sizes_list; + + FT_Generic autohint; /* face-specific auto-hinter data */ + void* extensions; /* unused */ + + FT_Face_Internal internal; + + /*@private end */ + + } FT_FaceRec; + + + /************************************************************************** + * + * @enum: + * FT_FACE_FLAG_XXX + * + * @description: + * A list of bit flags used in the `face_flags` field of the @FT_FaceRec + * structure. They inform client applications of properties of the + * corresponding face. + * + * @values: + * FT_FACE_FLAG_SCALABLE :: + * The face contains outline glyphs. Note that a face can contain + * bitmap strikes also, i.e., a face can have both this flag and + * @FT_FACE_FLAG_FIXED_SIZES set. + * + * FT_FACE_FLAG_FIXED_SIZES :: + * The face contains bitmap strikes. See also the `num_fixed_sizes` + * and `available_sizes` fields of @FT_FaceRec. + * + * FT_FACE_FLAG_FIXED_WIDTH :: + * The face contains fixed-width characters (like Courier, Lucida, + * MonoType, etc.). + * + * FT_FACE_FLAG_SFNT :: + * The face uses the SFNT storage scheme. For now, this means TrueType + * and OpenType. + * + * FT_FACE_FLAG_HORIZONTAL :: + * The face contains horizontal glyph metrics. This should be set for + * all common formats. + * + * FT_FACE_FLAG_VERTICAL :: + * The face contains vertical glyph metrics. This is only available in + * some formats, not all of them. + * + * FT_FACE_FLAG_KERNING :: + * The face contains kerning information. If set, the kerning distance + * can be retrieved using the function @FT_Get_Kerning. Otherwise the + * function always return the vector (0,0). Note that FreeType doesn't + * handle kerning data from the SFNT 'GPOS' table (as present in many + * OpenType fonts). + * + * FT_FACE_FLAG_FAST_GLYPHS :: + * THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. + * + * FT_FACE_FLAG_MULTIPLE_MASTERS :: + * The face contains multiple masters and is capable of interpolating + * between them. Supported formats are Adobe MM, TrueType GX, and + * OpenType variation fonts. + * + * See section @multiple_masters for API details. + * + * FT_FACE_FLAG_GLYPH_NAMES :: + * The face contains glyph names, which can be retrieved using + * @FT_Get_Glyph_Name. Note that some TrueType fonts contain broken + * glyph name tables. Use the function @FT_Has_PS_Glyph_Names when + * needed. + * + * FT_FACE_FLAG_EXTERNAL_STREAM :: + * Used internally by FreeType to indicate that a face's stream was + * provided by the client application and should not be destroyed when + * @FT_Done_Face is called. Don't read or test this flag. + * + * FT_FACE_FLAG_HINTER :: + * The font driver has a hinting machine of its own. For example, with + * TrueType fonts, it makes sense to use data from the SFNT 'gasp' + * table only if the native TrueType hinting engine (with the bytecode + * interpreter) is available and active. + * + * FT_FACE_FLAG_CID_KEYED :: + * The face is CID-keyed. In that case, the face is not accessed by + * glyph indices but by CID values. For subsetted CID-keyed fonts this + * has the consequence that not all index values are a valid argument + * to @FT_Load_Glyph. Only the CID values for which corresponding + * glyphs in the subsetted font exist make `FT_Load_Glyph` return + * successfully; in all other cases you get an + * `FT_Err_Invalid_Argument` error. + * + * Note that CID-keyed fonts that are in an SFNT wrapper (this is, all + * OpenType/CFF fonts) don't have this flag set since the glyphs are + * accessed in the normal way (using contiguous indices); the + * 'CID-ness' isn't visible to the application. + * + * FT_FACE_FLAG_TRICKY :: + * The face is 'tricky', this is, it always needs the font format's + * native hinting engine to get a reasonable result. A typical example + * is the old Chinese font `mingli.ttf` (but not `mingliu.ttc`) that + * uses TrueType bytecode instructions to move and scale all of its + * subglyphs. + * + * It is not possible to auto-hint such fonts using + * @FT_LOAD_FORCE_AUTOHINT; it will also ignore @FT_LOAD_NO_HINTING. + * You have to set both @FT_LOAD_NO_HINTING and @FT_LOAD_NO_AUTOHINT to + * really disable hinting; however, you probably never want this except + * for demonstration purposes. + * + * Currently, there are about a dozen TrueType fonts in the list of + * tricky fonts; they are hard-coded in file `ttobjs.c`. + * + * FT_FACE_FLAG_COLOR :: + * [Since 2.5.1] The face has color glyph tables. See @FT_LOAD_COLOR + * for more information. + * + * FT_FACE_FLAG_VARIATION :: + * [Since 2.9] Set if the current face (or named instance) has been + * altered with @FT_Set_MM_Design_Coordinates, + * @FT_Set_Var_Design_Coordinates, or @FT_Set_Var_Blend_Coordinates. + * This flag is unset by a call to @FT_Set_Named_Instance. + */ +#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) +#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) +#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) +#define FT_FACE_FLAG_SFNT ( 1L << 3 ) +#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) +#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) +#define FT_FACE_FLAG_KERNING ( 1L << 6 ) +#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) +#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) +#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) +#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) +#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) +#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) +#define FT_FACE_FLAG_COLOR ( 1L << 14 ) +#define FT_FACE_FLAG_VARIATION ( 1L << 15 ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_HORIZONTAL + * + * @description: + * A macro that returns true whenever a face object contains horizontal + * metrics (this is true for all font formats though). + * + * @also: + * @FT_HAS_VERTICAL can be used to check for vertical metrics. + * + */ +#define FT_HAS_HORIZONTAL( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_HORIZONTAL ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_VERTICAL + * + * @description: + * A macro that returns true whenever a face object contains real + * vertical metrics (and not only synthesized ones). + * + */ +#define FT_HAS_VERTICAL( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_VERTICAL ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_KERNING + * + * @description: + * A macro that returns true whenever a face object contains kerning data + * that can be accessed with @FT_Get_Kerning. + * + */ +#define FT_HAS_KERNING( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_KERNING ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_SCALABLE + * + * @description: + * A macro that returns true whenever a face object contains a scalable + * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, and + * PFR font formats). + * + */ +#define FT_IS_SCALABLE( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_SCALABLE ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_SFNT + * + * @description: + * A macro that returns true whenever a face object contains a font whose + * format is based on the SFNT storage scheme. This usually means: + * TrueType fonts, OpenType fonts, as well as SFNT-based embedded bitmap + * fonts. + * + * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and + * @FT_TRUETYPE_TABLES_H are available. + * + */ +#define FT_IS_SFNT( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_SFNT ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_FIXED_WIDTH + * + * @description: + * A macro that returns true whenever a face object contains a font face + * that contains fixed-width (or 'monospace', 'fixed-pitch', etc.) + * glyphs. + * + */ +#define FT_IS_FIXED_WIDTH( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_FIXED_SIZES + * + * @description: + * A macro that returns true whenever a face object contains some + * embedded bitmaps. See the `available_sizes` field of the @FT_FaceRec + * structure. + * + */ +#define FT_HAS_FIXED_SIZES( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_FAST_GLYPHS + * + * @description: + * Deprecated. + * + */ +#define FT_HAS_FAST_GLYPHS( face ) 0 + + + /************************************************************************** + * + * @macro: + * FT_HAS_GLYPH_NAMES + * + * @description: + * A macro that returns true whenever a face object contains some glyph + * names that can be accessed through @FT_Get_Glyph_Name. + * + */ +#define FT_HAS_GLYPH_NAMES( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_MULTIPLE_MASTERS + * + * @description: + * A macro that returns true whenever a face object contains some + * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H + * are then available to choose the exact design you want. + * + */ +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_NAMED_INSTANCE + * + * @description: + * A macro that returns true whenever a face object is a named instance + * of a GX or OpenType variation font. + * + * [Since 2.9] Changing the design coordinates with + * @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does + * not influence the return value of this macro (only + * @FT_Set_Named_Instance does that). + * + * @since: + * 2.7 + * + */ +#define FT_IS_NAMED_INSTANCE( face ) \ + ( !!( (face)->face_index & 0x7FFF0000L ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_VARIATION + * + * @description: + * A macro that returns true whenever a face object has been altered by + * @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates, or + * @FT_Set_Var_Blend_Coordinates. + * + * @since: + * 2.9 + * + */ +#define FT_IS_VARIATION( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_VARIATION ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_CID_KEYED + * + * @description: + * A macro that returns true whenever a face object contains a CID-keyed + * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more details. + * + * If this macro is true, all functions defined in @FT_CID_H are + * available. + * + */ +#define FT_IS_CID_KEYED( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_CID_KEYED ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_TRICKY + * + * @description: + * A macro that returns true whenever a face represents a 'tricky' font. + * See the discussion of @FT_FACE_FLAG_TRICKY for more details. + * + */ +#define FT_IS_TRICKY( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_TRICKY ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_COLOR + * + * @description: + * A macro that returns true whenever a face object contains tables for + * color glyphs. + * + * @since: + * 2.5.1 + * + */ +#define FT_HAS_COLOR( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_COLOR ) ) + + + /************************************************************************** + * + * @enum: + * FT_STYLE_FLAG_XXX + * + * @description: + * A list of bit flags to indicate the style of a given face. These are + * used in the `style_flags` field of @FT_FaceRec. + * + * @values: + * FT_STYLE_FLAG_ITALIC :: + * The face style is italic or oblique. + * + * FT_STYLE_FLAG_BOLD :: + * The face is bold. + * + * @note: + * The style information as provided by FreeType is very basic. More + * details are beyond the scope and should be done on a higher level (for + * example, by analyzing various fields of the 'OS/2' table in SFNT based + * fonts). + */ +#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) +#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + + + /************************************************************************** + * + * @type: + * FT_Size_Internal + * + * @description: + * An opaque handle to an `FT_Size_InternalRec` structure, used to model + * private data of a given @FT_Size object. + */ + typedef struct FT_Size_InternalRec_* FT_Size_Internal; + + + /************************************************************************** + * + * @struct: + * FT_Size_Metrics + * + * @description: + * The size metrics structure gives the metrics of a size object. + * + * @fields: + * x_ppem :: + * The width of the scaled EM square in pixels, hence the term 'ppem' + * (pixels per EM). It is also referred to as 'nominal width'. + * + * y_ppem :: + * The height of the scaled EM square in pixels, hence the term 'ppem' + * (pixels per EM). It is also referred to as 'nominal height'. + * + * x_scale :: + * A 16.16 fractional scaling value to convert horizontal metrics from + * font units to 26.6 fractional pixels. Only relevant for scalable + * font formats. + * + * y_scale :: + * A 16.16 fractional scaling value to convert vertical metrics from + * font units to 26.6 fractional pixels. Only relevant for scalable + * font formats. + * + * ascender :: + * The ascender in 26.6 fractional pixels, rounded up to an integer + * value. See @FT_FaceRec for the details. + * + * descender :: + * The descender in 26.6 fractional pixels, rounded down to an integer + * value. See @FT_FaceRec for the details. + * + * height :: + * The height in 26.6 fractional pixels, rounded to an integer value. + * See @FT_FaceRec for the details. + * + * max_advance :: + * The maximum advance width in 26.6 fractional pixels, rounded to an + * integer value. See @FT_FaceRec for the details. + * + * @note: + * The scaling values, if relevant, are determined first during a size + * changing operation. The remaining fields are then set by the driver. + * For scalable formats, they are usually set to scaled values of the + * corresponding fields in @FT_FaceRec. Some values like ascender or + * descender are rounded for historical reasons; more precise values (for + * outline fonts) can be derived by scaling the corresponding @FT_FaceRec + * values manually, with code similar to the following. + * + * ``` + * scaled_ascender = FT_MulFix( face->ascender, + * size_metrics->y_scale ); + * ``` + * + * Note that due to glyph hinting and the selected rendering mode these + * values are usually not exact; consequently, they must be treated as + * unreliable with an error margin of at least one pixel! + * + * Indeed, the only way to get the exact metrics is to render _all_ + * glyphs. As this would be a definite performance hit, it is up to + * client applications to perform such computations. + * + * The `FT_Size_Metrics` structure is valid for bitmap fonts also. + * + * + * **TrueType fonts with native bytecode hinting** + * + * All applications that handle TrueType fonts with native hinting must + * be aware that TTFs expect different rounding of vertical font + * dimensions. The application has to cater for this, especially if it + * wants to rely on a TTF's vertical data (for example, to properly align + * box characters vertically). + * + * Only the application knows _in advance_ that it is going to use native + * hinting for TTFs! FreeType, on the other hand, selects the hinting + * mode not at the time of creating an @FT_Size object but much later, + * namely while calling @FT_Load_Glyph. + * + * Here is some pseudo code that illustrates a possible solution. + * + * ``` + * font_format = FT_Get_Font_Format( face ); + * + * if ( !strcmp( font_format, "TrueType" ) && + * do_native_bytecode_hinting ) + * { + * ascender = ROUND( FT_MulFix( face->ascender, + * size_metrics->y_scale ) ); + * descender = ROUND( FT_MulFix( face->descender, + * size_metrics->y_scale ) ); + * } + * else + * { + * ascender = size_metrics->ascender; + * descender = size_metrics->descender; + * } + * + * height = size_metrics->height; + * max_advance = size_metrics->max_advance; + * ``` + */ + typedef struct FT_Size_Metrics_ + { + FT_UShort x_ppem; /* horizontal pixels per EM */ + FT_UShort y_ppem; /* vertical pixels per EM */ + + FT_Fixed x_scale; /* scaling values used to convert font */ + FT_Fixed y_scale; /* units to 26.6 fractional pixels */ + + FT_Pos ascender; /* ascender in 26.6 frac. pixels */ + FT_Pos descender; /* descender in 26.6 frac. pixels */ + FT_Pos height; /* text height in 26.6 frac. pixels */ + FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ + + } FT_Size_Metrics; + + + /************************************************************************** + * + * @struct: + * FT_SizeRec + * + * @description: + * FreeType root size class structure. A size object models a face + * object at a given size. + * + * @fields: + * face :: + * Handle to the parent face object. + * + * generic :: + * A typeless pointer, unused by the FreeType library or any of its + * drivers. It can be used by client applications to link their own + * data to each size object. + * + * metrics :: + * Metrics for this size object. This field is read-only. + */ + typedef struct FT_SizeRec_ + { + FT_Face face; /* parent face object */ + FT_Generic generic; /* generic pointer for client uses */ + FT_Size_Metrics metrics; /* size metrics */ + FT_Size_Internal internal; + + } FT_SizeRec; + + + /************************************************************************** + * + * @struct: + * FT_SubGlyph + * + * @description: + * The subglyph structure is an internal object used to describe + * subglyphs (for example, in the case of composites). + * + * @note: + * The subglyph implementation is not part of the high-level API, hence + * the forward structure declaration. + * + * You can however retrieve subglyph information with + * @FT_Get_SubGlyph_Info. + */ + typedef struct FT_SubGlyphRec_* FT_SubGlyph; + + + /************************************************************************** + * + * @type: + * FT_Slot_Internal + * + * @description: + * An opaque handle to an `FT_Slot_InternalRec` structure, used to model + * private data of a given @FT_GlyphSlot object. + */ + typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + + + /************************************************************************** + * + * @struct: + * FT_GlyphSlotRec + * + * @description: + * FreeType root glyph slot class structure. A glyph slot is a container + * where individual glyphs can be loaded, be they in outline or bitmap + * format. + * + * @fields: + * library :: + * A handle to the FreeType library instance this slot belongs to. + * + * face :: + * A handle to the parent face object. + * + * next :: + * In some cases (like some font tools), several glyph slots per face + * object can be a good thing. As this is rare, the glyph slots are + * listed through a direct, single-linked list using its `next` field. + * + * glyph_index :: + * [Since 2.10] The glyph index passed as an argument to @FT_Load_Glyph + * while initializing the glyph slot. + * + * generic :: + * A typeless pointer unused by the FreeType library or any of its + * drivers. It can be used by client applications to link their own + * data to each glyph slot object. + * + * metrics :: + * The metrics of the last loaded glyph in the slot. The returned + * values depend on the last load flags (see the @FT_Load_Glyph API + * function) and can be expressed either in 26.6 fractional pixels or + * font units. + * + * Note that even when the glyph image is transformed, the metrics are + * not. + * + * linearHoriAdvance :: + * The advance width of the unhinted glyph. Its value is expressed in + * 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when + * loading the glyph. This field can be important to perform correct + * WYSIWYG layout. Only relevant for outline glyphs. + * + * linearVertAdvance :: + * The advance height of the unhinted glyph. Its value is expressed in + * 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when + * loading the glyph. This field can be important to perform correct + * WYSIWYG layout. Only relevant for outline glyphs. + * + * advance :: + * This shorthand is, depending on @FT_LOAD_IGNORE_TRANSFORM, the + * transformed (hinted) advance width for the glyph, in 26.6 fractional + * pixel format. As specified with @FT_LOAD_VERTICAL_LAYOUT, it uses + * either the `horiAdvance` or the `vertAdvance` value of `metrics` + * field. + * + * format :: + * This field indicates the format of the image contained in the glyph + * slot. Typically @FT_GLYPH_FORMAT_BITMAP, @FT_GLYPH_FORMAT_OUTLINE, + * or @FT_GLYPH_FORMAT_COMPOSITE, but other values are possible. + * + * bitmap :: + * This field is used as a bitmap descriptor. Note that the address + * and content of the bitmap buffer can change between calls of + * @FT_Load_Glyph and a few other functions. + * + * bitmap_left :: + * The bitmap's left bearing expressed in integer pixels. + * + * bitmap_top :: + * The bitmap's top bearing expressed in integer pixels. This is the + * distance from the baseline to the top-most glyph scanline, upwards + * y~coordinates being **positive**. + * + * outline :: + * The outline descriptor for the current glyph image if its format is + * @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is loaded, `outline` can be + * transformed, distorted, emboldened, etc. However, it must not be + * freed. + * + * [Since 2.10.1] If @FT_LOAD_NO_SCALE is set, outline coordinates of + * OpenType variation fonts for a selected instance are internally + * handled as 26.6 fractional font units but returned as (rounded) + * integers, as expected. To get unrounded font units, don't use + * @FT_LOAD_NO_SCALE but load the glyph with @FT_LOAD_NO_HINTING and + * scale it, using the font's `units_per_EM` value as the ppem. + * + * num_subglyphs :: + * The number of subglyphs in a composite glyph. This field is only + * valid for the composite glyph format that should normally only be + * loaded with the @FT_LOAD_NO_RECURSE flag. + * + * subglyphs :: + * An array of subglyph descriptors for composite glyphs. There are + * `num_subglyphs` elements in there. Currently internal to FreeType. + * + * control_data :: + * Certain font drivers can also return the control data for a given + * glyph image (e.g. TrueType bytecode, Type~1 charstrings, etc.). + * This field is a pointer to such data; it is currently internal to + * FreeType. + * + * control_len :: + * This is the length in bytes of the control data. Currently internal + * to FreeType. + * + * other :: + * Reserved. + * + * lsb_delta :: + * The difference between hinted and unhinted left side bearing while + * auto-hinting is active. Zero otherwise. + * + * rsb_delta :: + * The difference between hinted and unhinted right side bearing while + * auto-hinting is active. Zero otherwise. + * + * @note: + * If @FT_Load_Glyph is called with default flags (see @FT_LOAD_DEFAULT) + * the glyph image is loaded in the glyph slot in its native format + * (e.g., an outline glyph for TrueType and Type~1 formats). [Since 2.9] + * The prospective bitmap metrics are calculated according to + * @FT_LOAD_TARGET_XXX and other flags even for the outline glyph, even + * if @FT_LOAD_RENDER is not set. + * + * This image can later be converted into a bitmap by calling + * @FT_Render_Glyph. This function searches the current renderer for the + * native image's format, then invokes it. + * + * The renderer is in charge of transforming the native image through the + * slot's face transformation fields, then converting it into a bitmap + * that is returned in `slot->bitmap`. + * + * Note that `slot->bitmap_left` and `slot->bitmap_top` are also used to + * specify the position of the bitmap relative to the current pen + * position (e.g., coordinates (0,0) on the baseline). Of course, + * `slot->format` is also changed to @FT_GLYPH_FORMAT_BITMAP. + * + * Here is a small pseudo code fragment that shows how to use `lsb_delta` + * and `rsb_delta` to do fractional positioning of glyphs: + * + * ``` + * FT_GlyphSlot slot = face->glyph; + * FT_Pos origin_x = 0; + * + * + * for all glyphs do + * + * + * FT_Outline_Translate( slot->outline, origin_x & 63, 0 ); + * + * + * + * + * + * origin_x += slot->advance.x; + * origin_x += slot->lsb_delta - slot->rsb_delta; + * endfor + * ``` + * + * Here is another small pseudo code fragment that shows how to use + * `lsb_delta` and `rsb_delta` to improve integer positioning of glyphs: + * + * ``` + * FT_GlyphSlot slot = face->glyph; + * FT_Pos origin_x = 0; + * FT_Pos prev_rsb_delta = 0; + * + * + * for all glyphs do + * + * + * + * + * if ( prev_rsb_delta - slot->lsb_delta > 32 ) + * origin_x -= 64; + * else if ( prev_rsb_delta - slot->lsb_delta < -31 ) + * origin_x += 64; + * + * prev_rsb_delta = slot->rsb_delta; + * + * + * + * origin_x += slot->advance.x; + * endfor + * ``` + * + * If you use strong auto-hinting, you **must** apply these delta values! + * Otherwise you will experience far too large inter-glyph spacing at + * small rendering sizes in most cases. Note that it doesn't harm to use + * the above code for other hinting modes also, since the delta values + * are zero then. + */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt glyph_index; /* new in 2.10; was reserved previously */ + FT_Generic generic; + + FT_Glyph_Metrics metrics; + FT_Fixed linearHoriAdvance; + FT_Fixed linearVertAdvance; + FT_Vector advance; + + FT_Glyph_Format format; + + FT_Bitmap bitmap; + FT_Int bitmap_left; + FT_Int bitmap_top; + + FT_Outline outline; + + FT_UInt num_subglyphs; + FT_SubGlyph subglyphs; + + void* control_data; + long control_len; + + FT_Pos lsb_delta; + FT_Pos rsb_delta; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @function: + * FT_Init_FreeType + * + * @description: + * Initialize a new FreeType library object. The set of modules that are + * registered by this function is determined at build time. + * + * @output: + * alibrary :: + * A handle to a new library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * In case you want to provide your own memory allocating routines, use + * @FT_New_Library instead, followed by a call to @FT_Add_Default_Modules + * (or a series of calls to @FT_Add_Module) and + * @FT_Set_Default_Properties. + * + * See the documentation of @FT_Library and @FT_Face for multi-threading + * issues. + * + * If you need reference-counting (cf. @FT_Reference_Library), use + * @FT_New_Library and @FT_Done_Library. + * + * If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is + * set, this function reads the `FREETYPE_PROPERTIES` environment + * variable to control driver properties. See section @properties for + * more. + */ + FT_EXPORT( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ); + + + /************************************************************************** + * + * @function: + * FT_Done_FreeType + * + * @description: + * Destroy a given FreeType library object and all of its children, + * including resources, drivers, faces, sizes, etc. + * + * @input: + * library :: + * A handle to the target library object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_FreeType( FT_Library library ); + + + /************************************************************************** + * + * @enum: + * FT_OPEN_XXX + * + * @description: + * A list of bit field constants used within the `flags` field of the + * @FT_Open_Args structure. + * + * @values: + * FT_OPEN_MEMORY :: + * This is a memory-based stream. + * + * FT_OPEN_STREAM :: + * Copy the stream from the `stream` field. + * + * FT_OPEN_PATHNAME :: + * Create a new input stream from a C~path name. + * + * FT_OPEN_DRIVER :: + * Use the `driver` field. + * + * FT_OPEN_PARAMS :: + * Use the `num_params` and `params` fields. + * + * @note: + * The `FT_OPEN_MEMORY`, `FT_OPEN_STREAM`, and `FT_OPEN_PATHNAME` flags + * are mutually exclusive. + */ +#define FT_OPEN_MEMORY 0x1 +#define FT_OPEN_STREAM 0x2 +#define FT_OPEN_PATHNAME 0x4 +#define FT_OPEN_DRIVER 0x8 +#define FT_OPEN_PARAMS 0x10 + + + /* these constants are deprecated; use the corresponding `FT_OPEN_XXX` */ + /* values instead */ +#define ft_open_memory FT_OPEN_MEMORY +#define ft_open_stream FT_OPEN_STREAM +#define ft_open_pathname FT_OPEN_PATHNAME +#define ft_open_driver FT_OPEN_DRIVER +#define ft_open_params FT_OPEN_PARAMS + + + /************************************************************************** + * + * @struct: + * FT_Parameter + * + * @description: + * A simple structure to pass more or less generic parameters to + * @FT_Open_Face and @FT_Face_Properties. + * + * @fields: + * tag :: + * A four-byte identification tag. + * + * data :: + * A pointer to the parameter data. + * + * @note: + * The ID and function of parameters are driver-specific. See section + * @parameter_tags for more information. + */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /************************************************************************** + * + * @struct: + * FT_Open_Args + * + * @description: + * A structure to indicate how to open a new font file or stream. A + * pointer to such a structure can be used as a parameter for the + * functions @FT_Open_Face and @FT_Attach_Stream. + * + * @fields: + * flags :: + * A set of bit flags indicating how to use the structure. + * + * memory_base :: + * The first byte of the file in memory. + * + * memory_size :: + * The size in bytes of the file in memory. + * + * pathname :: + * A pointer to an 8-bit file pathname. The pointer is not owned by + * FreeType. + * + * stream :: + * A handle to a source stream object. + * + * driver :: + * This field is exclusively used by @FT_Open_Face; it simply specifies + * the font driver to use for opening the face. If set to `NULL`, + * FreeType tries to load the face with each one of the drivers in its + * list. + * + * num_params :: + * The number of extra parameters. + * + * params :: + * Extra parameters passed to the font driver when opening a new face. + * + * @note: + * The stream type is determined by the contents of `flags`: + * + * If the @FT_OPEN_MEMORY bit is set, assume that this is a memory file + * of `memory_size` bytes, located at `memory_address`. The data are not + * copied, and the client is responsible for releasing and destroying + * them _after_ the corresponding call to @FT_Done_Face. + * + * Otherwise, if the @FT_OPEN_STREAM bit is set, assume that a custom + * input stream `stream` is used. + * + * Otherwise, if the @FT_OPEN_PATHNAME bit is set, assume that this is a + * normal file and use `pathname` to open it. + * + * If none of the above bits are set or if multiple are set at the same + * time, the flags are invalid and @FT_Open_Face fails. + * + * If the @FT_OPEN_DRIVER bit is set, @FT_Open_Face only tries to open + * the file with the driver whose handler is in `driver`. + * + * If the @FT_OPEN_PARAMS bit is set, the parameters given by + * `num_params` and `params` is used. They are ignored otherwise. + * + * Ideally, both the `pathname` and `params` fields should be tagged as + * 'const'; this is missing for API backward compatibility. In other + * words, applications should treat them as read-only. + */ + typedef struct FT_Open_Args_ + { + FT_UInt flags; + const FT_Byte* memory_base; + FT_Long memory_size; + FT_String* pathname; + FT_Stream stream; + FT_Module driver; + FT_Int num_params; + FT_Parameter* params; + + } FT_Open_Args; + + + /************************************************************************** + * + * @function: + * FT_New_Face + * + * @description: + * Call @FT_Open_Face to open a font by its pathname. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * pathname :: + * A path to the font file. + * + * face_index :: + * See @FT_Open_Face for a detailed description of this parameter. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Use @FT_Done_Face to destroy the created @FT_Face object (along with + * its slot and sizes). + */ + FT_EXPORT( FT_Error ) + FT_New_Face( FT_Library library, + const char* filepathname, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_New_Memory_Face + * + * @description: + * Call @FT_Open_Face to open a font that has been loaded into memory. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * file_base :: + * A pointer to the beginning of the font data. + * + * file_size :: + * The size of the memory chunk used by the font data. + * + * face_index :: + * See @FT_Open_Face for a detailed description of this parameter. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You must not deallocate the memory before calling @FT_Done_Face. + */ + FT_EXPORT( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_Open_Face + * + * @description: + * Create a face object from a given resource described by @FT_Open_Args. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * args :: + * A pointer to an `FT_Open_Args` structure that must be filled by the + * caller. + * + * face_index :: + * This field holds two different values. Bits 0-15 are the index of + * the face in the font file (starting with value~0). Set it to~0 if + * there is only one face in the font file. + * + * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation + * fonts only, specifying the named instance index for the current face + * index (starting with value~1; value~0 makes FreeType ignore named + * instances). For non-variation fonts, bits 16-30 are ignored. + * Assuming that you want to access the third named instance in face~4, + * `face_index` should be set to 0x00030004. If you want to access + * face~4 without variation handling, simply set `face_index` to + * value~4. + * + * `FT_Open_Face` and its siblings can be used to quickly check whether + * the font format of a given font resource is supported by FreeType. + * In general, if the `face_index` argument is negative, the function's + * return value is~0 if the font format is recognized, or non-zero + * otherwise. The function allocates a more or less empty face handle + * in `*aface` (if `aface` isn't `NULL`); the only two useful fields in + * this special case are `face->num_faces` and `face->style_flags`. + * For any negative value of `face_index`, `face->num_faces` gives the + * number of faces within the font file. For the negative value + * '-(N+1)' (with 'N' a non-negative 16-bit value), bits 16-30 in + * `face->style_flags` give the number of named instances in face 'N' + * if we have a variation font (or zero otherwise). After examination, + * the returned @FT_Face structure should be deallocated with a call to + * @FT_Done_Face. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Unlike FreeType 1.x, this function automatically creates a glyph slot + * for the face object that can be accessed directly through + * `face->glyph`. + * + * Each new face object created with this function also owns a default + * @FT_Size object, accessible as `face->size`. + * + * One @FT_Library instance can have multiple face objects, this is, + * @FT_Open_Face and its siblings can be called multiple times using the + * same `library` argument. + * + * See the discussion of reference counters in the description of + * @FT_Reference_Face. + * + * If `FT_OPEN_STREAM` is set in `args->flags`, the stream in + * `args->stream` is automatically closed before this function returns + * any error (including `FT_Err_Invalid_Argument`). + * + * @example: + * To loop over all faces, use code similar to the following snippet + * (omitting the error handling). + * + * ``` + * ... + * FT_Face face; + * FT_Long i, num_faces; + * + * + * error = FT_Open_Face( library, args, -1, &face ); + * if ( error ) { ... } + * + * num_faces = face->num_faces; + * FT_Done_Face( face ); + * + * for ( i = 0; i < num_faces; i++ ) + * { + * ... + * error = FT_Open_Face( library, args, i, &face ); + * ... + * FT_Done_Face( face ); + * ... + * } + * ``` + * + * To loop over all valid values for `face_index`, use something similar + * to the following snippet, again without error handling. The code + * accesses all faces immediately (thus only a single call of + * `FT_Open_Face` within the do-loop), with and without named instances. + * + * ``` + * ... + * FT_Face face; + * + * FT_Long num_faces = 0; + * FT_Long num_instances = 0; + * + * FT_Long face_idx = 0; + * FT_Long instance_idx = 0; + * + * + * do + * { + * FT_Long id = ( instance_idx << 16 ) + face_idx; + * + * + * error = FT_Open_Face( library, args, id, &face ); + * if ( error ) { ... } + * + * num_faces = face->num_faces; + * num_instances = face->style_flags >> 16; + * + * ... + * + * FT_Done_Face( face ); + * + * if ( instance_idx < num_instances ) + * instance_idx++; + * else + * { + * face_idx++; + * instance_idx = 0; + * } + * + * } while ( face_idx < num_faces ) + * ``` + */ + FT_EXPORT( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_Attach_File + * + * @description: + * Call @FT_Attach_Stream to attach a file. + * + * @inout: + * face :: + * The target face object. + * + * @input: + * filepathname :: + * The pathname. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ); + + + /************************************************************************** + * + * @function: + * FT_Attach_Stream + * + * @description: + * 'Attach' data to a face object. Normally, this is used to read + * additional information for the face object. For example, you can + * attach an AFM file that comes with a Type~1 font to get the kerning + * values and other metrics. + * + * @inout: + * face :: + * The target face object. + * + * @input: + * parameters :: + * A pointer to @FT_Open_Args that must be filled by the caller. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The meaning of the 'attach' (i.e., what really happens when the new + * file is read) is not fixed by FreeType itself. It really depends on + * the font format (and thus the font driver). + * + * Client applications are expected to know what they are doing when + * invoking this function. Most drivers simply do not implement file or + * stream attachments. + */ + FT_EXPORT( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ); + + + /************************************************************************** + * + * @function: + * FT_Reference_Face + * + * @description: + * A counter gets initialized to~1 at the time an @FT_Face structure is + * created. This function increments the counter. @FT_Done_Face then + * only destroys a face if the counter is~1, otherwise it simply + * decrements the counter. + * + * This function helps in managing life-cycles of structures that + * reference @FT_Face objects. + * + * @input: + * face :: + * A handle to a target face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.4.2 + * + */ + FT_EXPORT( FT_Error ) + FT_Reference_Face( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Done_Face + * + * @description: + * Discard a given face object, as well as all of its child slots and + * sizes. + * + * @input: + * face :: + * A handle to a target face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Face. + */ + FT_EXPORT( FT_Error ) + FT_Done_Face( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Select_Size + * + * @description: + * Select a bitmap strike. To be more precise, this function sets the + * scaling factors of the active @FT_Size object in a face so that + * bitmaps from this particular strike are taken by @FT_Load_Glyph and + * friends. + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * strike_index :: + * The index of the bitmap strike in the `available_sizes` field of + * @FT_FaceRec structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * For bitmaps embedded in outline fonts it is common that only a subset + * of the available glyphs at a given ppem value is available. FreeType + * silently uses outlines if there is no bitmap for a given glyph index. + * + * For GX and OpenType variation fonts, a bitmap strike makes sense only + * if the default instance is active (this is, no glyph variation takes + * place); otherwise, FreeType simply ignores bitmap strikes. The same + * is true for all named instances that are different from the default + * instance. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ); + + + /************************************************************************** + * + * @enum: + * FT_Size_Request_Type + * + * @description: + * An enumeration type that lists the supported size request types, i.e., + * what input size (in font units) maps to the requested output size (in + * pixels, as computed from the arguments of @FT_Size_Request). + * + * @values: + * FT_SIZE_REQUEST_TYPE_NOMINAL :: + * The nominal size. The `units_per_EM` field of @FT_FaceRec is used + * to determine both scaling values. + * + * This is the standard scaling found in most applications. In + * particular, use this size request type for TrueType fonts if they + * provide optical scaling or something similar. Note, however, that + * `units_per_EM` is a rather abstract value which bears no relation to + * the actual size of the glyphs in a font. + * + * FT_SIZE_REQUEST_TYPE_REAL_DIM :: + * The real dimension. The sum of the `ascender` and (minus of) the + * `descender` fields of @FT_FaceRec is used to determine both scaling + * values. + * + * FT_SIZE_REQUEST_TYPE_BBOX :: + * The font bounding box. The width and height of the `bbox` field of + * @FT_FaceRec are used to determine the horizontal and vertical + * scaling value, respectively. + * + * FT_SIZE_REQUEST_TYPE_CELL :: + * The `max_advance_width` field of @FT_FaceRec is used to determine + * the horizontal scaling value; the vertical scaling value is + * determined the same way as @FT_SIZE_REQUEST_TYPE_REAL_DIM does. + * Finally, both scaling values are set to the smaller one. This type + * is useful if you want to specify the font size for, say, a window of + * a given dimension and 80x24 cells. + * + * FT_SIZE_REQUEST_TYPE_SCALES :: + * Specify the scaling values directly. + * + * @note: + * The above descriptions only apply to scalable formats. For bitmap + * formats, the behaviour is up to the driver. + * + * See the note section of @FT_Size_Metrics if you wonder how size + * requesting relates to scaling values. + */ + typedef enum FT_Size_Request_Type_ + { + FT_SIZE_REQUEST_TYPE_NOMINAL, + FT_SIZE_REQUEST_TYPE_REAL_DIM, + FT_SIZE_REQUEST_TYPE_BBOX, + FT_SIZE_REQUEST_TYPE_CELL, + FT_SIZE_REQUEST_TYPE_SCALES, + + FT_SIZE_REQUEST_TYPE_MAX + + } FT_Size_Request_Type; + + + /************************************************************************** + * + * @struct: + * FT_Size_RequestRec + * + * @description: + * A structure to model a size request. + * + * @fields: + * type :: + * See @FT_Size_Request_Type. + * + * width :: + * The desired width, given as a 26.6 fractional point value (with 72pt + * = 1in). + * + * height :: + * The desired height, given as a 26.6 fractional point value (with + * 72pt = 1in). + * + * horiResolution :: + * The horizontal resolution (dpi, i.e., pixels per inch). If set to + * zero, `width` is treated as a 26.6 fractional **pixel** value, which + * gets internally rounded to an integer. + * + * vertResolution :: + * The vertical resolution (dpi, i.e., pixels per inch). If set to + * zero, `height` is treated as a 26.6 fractional **pixel** value, + * which gets internally rounded to an integer. + * + * @note: + * If `width` is zero, the horizontal scaling value is set equal to the + * vertical scaling value, and vice versa. + * + * If `type` is `FT_SIZE_REQUEST_TYPE_SCALES`, `width` and `height` are + * interpreted directly as 16.16 fractional scaling values, without any + * further modification, and both `horiResolution` and `vertResolution` + * are ignored. + */ + typedef struct FT_Size_RequestRec_ + { + FT_Size_Request_Type type; + FT_Long width; + FT_Long height; + FT_UInt horiResolution; + FT_UInt vertResolution; + + } FT_Size_RequestRec; + + + /************************************************************************** + * + * @struct: + * FT_Size_Request + * + * @description: + * A handle to a size request structure. + */ + typedef struct FT_Size_RequestRec_ *FT_Size_Request; + + + /************************************************************************** + * + * @function: + * FT_Request_Size + * + * @description: + * Resize the scale of the active @FT_Size object in a face. + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * req :: + * A pointer to a @FT_Size_RequestRec. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Although drivers may select the bitmap strike matching the request, + * you should not rely on this if you intend to select a particular + * bitmap strike. Use @FT_Select_Size instead in that case. + * + * The relation between the requested size and the resulting glyph size + * is dependent entirely on how the size is defined in the source face. + * The font designer chooses the final size of each glyph relative to + * this size. For more information refer to + * 'https://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'. + * + * Contrary to @FT_Set_Char_Size, this function doesn't have special code + * to normalize zero-valued widths, heights, or resolutions (which lead + * to errors in most cases). + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ); + + + /************************************************************************** + * + * @function: + * FT_Set_Char_Size + * + * @description: + * Call @FT_Request_Size to request the nominal size (in points). + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * char_width :: + * The nominal width, in 26.6 fractional points. + * + * char_height :: + * The nominal height, in 26.6 fractional points. + * + * horz_resolution :: + * The horizontal resolution in dpi. + * + * vert_resolution :: + * The vertical resolution in dpi. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * While this function allows fractional points as input values, the + * resulting ppem value for the given resolution is always rounded to the + * nearest integer. + * + * If either the character width or height is zero, it is set equal to + * the other value. + * + * If either the horizontal or vertical resolution is zero, it is set + * equal to the other value. + * + * A character width or height smaller than 1pt is set to 1pt; if both + * resolution values are zero, they are set to 72dpi. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + + /************************************************************************** + * + * @function: + * FT_Set_Pixel_Sizes + * + * @description: + * Call @FT_Request_Size to request the nominal size (in pixels). + * + * @inout: + * face :: + * A handle to the target face object. + * + * @input: + * pixel_width :: + * The nominal width, in pixels. + * + * pixel_height :: + * The nominal height, in pixels. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should not rely on the resulting glyphs matching or being + * constrained to this pixel size. Refer to @FT_Request_Size to + * understand how requested sizes relate to actual sizes. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + + /************************************************************************** + * + * @function: + * FT_Load_Glyph + * + * @description: + * Load a glyph into the glyph slot of a face object. + * + * @inout: + * face :: + * A handle to the target face object where the glyph is loaded. + * + * @input: + * glyph_index :: + * The index of the glyph in the font file. For CID-keyed fonts + * (either in PS or in CFF format) this argument specifies the CID + * value. + * + * load_flags :: + * A flag indicating what to load for this glyph. The @FT_LOAD_XXX + * constants can be used to control the glyph loading process (e.g., + * whether the outline should be scaled, whether to load bitmaps or + * not, whether to hint the outline, etc). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The loaded glyph may be transformed. See @FT_Set_Transform for the + * details. + * + * For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument` is returned + * for invalid CID values (this is, for CID values that don't have a + * corresponding glyph in the font). See the discussion of the + * @FT_FACE_FLAG_CID_KEYED flag for more details. + * + * If you receive `FT_Err_Glyph_Too_Big`, try getting the glyph outline + * at EM size, then scale it manually and fill it as a graphics + * operation. + */ + FT_EXPORT( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /************************************************************************** + * + * @function: + * FT_Load_Char + * + * @description: + * Load a glyph into the glyph slot of a face object, accessed by its + * character code. + * + * @inout: + * face :: + * A handle to a target face object where the glyph is loaded. + * + * @input: + * char_code :: + * The glyph's character code, according to the current charmap used in + * the face. + * + * load_flags :: + * A flag indicating what to load for this glyph. The @FT_LOAD_XXX + * constants can be used to control the glyph loading process (e.g., + * whether the outline should be scaled, whether to load bitmaps or + * not, whether to hint the outline, etc). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. + * + * Many fonts contain glyphs that can't be loaded by this function since + * its glyph indices are not listed in any of the font's charmaps. + * + * If no active cmap is set up (i.e., `face->charmap` is zero), the call + * to @FT_Get_Char_Index is omitted, and the function behaves identically + * to @FT_Load_Glyph. + */ + FT_EXPORT( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ); + + + /************************************************************************** + * + * @enum: + * FT_LOAD_XXX + * + * @description: + * A list of bit field constants for @FT_Load_Glyph to indicate what kind + * of operations to perform during glyph loading. + * + * @values: + * FT_LOAD_DEFAULT :: + * Corresponding to~0, this value is used as the default glyph load + * operation. In this case, the following happens: + * + * 1. FreeType looks for a bitmap for the glyph corresponding to the + * face's current size. If one is found, the function returns. The + * bitmap data can be accessed from the glyph slot (see note below). + * + * 2. If no embedded bitmap is searched for or found, FreeType looks + * for a scalable outline. If one is found, it is loaded from the font + * file, scaled to device pixels, then 'hinted' to the pixel grid in + * order to optimize it. The outline data can be accessed from the + * glyph slot (see note below). + * + * Note that by default the glyph loader doesn't render outlines into + * bitmaps. The following flags are used to modify this default + * behaviour to more specific and useful cases. + * + * FT_LOAD_NO_SCALE :: + * Don't scale the loaded outline glyph but keep it in font units. + * + * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and + * unsets @FT_LOAD_RENDER. + * + * If the font is 'tricky' (see @FT_FACE_FLAG_TRICKY for more), using + * `FT_LOAD_NO_SCALE` usually yields meaningless outlines because the + * subglyphs must be scaled and positioned with hinting instructions. + * This can be solved by loading the font without `FT_LOAD_NO_SCALE` + * and setting the character size to `font->units_per_EM`. + * + * FT_LOAD_NO_HINTING :: + * Disable hinting. This generally generates 'blurrier' bitmap glyphs + * when the glyph are rendered in any of the anti-aliased modes. See + * also the note below. + * + * This flag is implied by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_RENDER :: + * Call @FT_Render_Glyph after the glyph is loaded. By default, the + * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be + * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. + * + * This flag is unset by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_NO_BITMAP :: + * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this + * flag. + * + * @FT_LOAD_NO_SCALE always sets this flag. + * + * FT_LOAD_VERTICAL_LAYOUT :: + * Load the glyph for vertical text layout. In particular, the + * `advance` value in the @FT_GlyphSlotRec structure is set to the + * `vertAdvance` value of the `metrics` field. + * + * In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use this + * flag currently. Reason is that in this case vertical metrics get + * synthesized, and those values are not always consistent across + * various font formats. + * + * FT_LOAD_FORCE_AUTOHINT :: + * Prefer the auto-hinter over the font's native hinter. See also the + * note below. + * + * FT_LOAD_PEDANTIC :: + * Make the font driver perform pedantic verifications during glyph + * loading and hinting. This is mostly used to detect broken glyphs in + * fonts. By default, FreeType tries to handle broken fonts also. + * + * In particular, errors from the TrueType bytecode engine are not + * passed to the application if this flag is not set; this might result + * in partially hinted or distorted glyphs in case a glyph's bytecode + * is buggy. + * + * FT_LOAD_NO_RECURSE :: + * Don't load composite glyphs recursively. Instead, the font driver + * fills the `num_subglyph` and `subglyphs` values of the glyph slot; + * it also sets `glyph->format` to @FT_GLYPH_FORMAT_COMPOSITE. The + * description of subglyphs can then be accessed with + * @FT_Get_SubGlyph_Info. + * + * Don't use this flag for retrieving metrics information since some + * font drivers only return rudimentary data. + * + * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. + * + * FT_LOAD_IGNORE_TRANSFORM :: + * Ignore the transform matrix set by @FT_Set_Transform. + * + * FT_LOAD_MONOCHROME :: + * This flag is used with @FT_LOAD_RENDER to indicate that you want to + * render an outline glyph to a 1-bit monochrome bitmap glyph, with + * 8~pixels packed into each byte of the bitmap data. + * + * Note that this has no effect on the hinting algorithm used. You + * should rather use @FT_LOAD_TARGET_MONO so that the + * monochrome-optimized hinting algorithm is used. + * + * FT_LOAD_LINEAR_DESIGN :: + * Keep `linearHoriAdvance` and `linearVertAdvance` fields of + * @FT_GlyphSlotRec in font units. See @FT_GlyphSlotRec for details. + * + * FT_LOAD_NO_AUTOHINT :: + * Disable the auto-hinter. See also the note below. + * + * FT_LOAD_COLOR :: + * Load colored glyphs. There are slight differences depending on the + * font format. + * + * [Since 2.5] Load embedded color bitmap images. The resulting color + * bitmaps, if available, will have the @FT_PIXEL_MODE_BGRA format, + * with pre-multiplied color channels. If the flag is not set and + * color bitmaps are found, they are converted to 256-level gray + * bitmaps, using the @FT_PIXEL_MODE_GRAY format. + * + * [Since 2.10, experimental] If the glyph index contains an entry in + * the face's 'COLR' table with a 'CPAL' palette table (as defined in + * the OpenType specification), make @FT_Render_Glyph provide a default + * blending of the color glyph layers associated with the glyph index, + * using the same bitmap format as embedded color bitmap images. This + * is mainly for convenience; for full control of color layers use + * @FT_Get_Color_Glyph_Layer and FreeType's color functions like + * @FT_Palette_Select instead of setting @FT_LOAD_COLOR for rendering + * so that the client application can handle blending by itself. + * + * FT_LOAD_COMPUTE_METRICS :: + * [Since 2.6.1] Compute glyph metrics from the glyph data, without the + * use of bundled metrics tables (for example, the 'hdmx' table in + * TrueType fonts). This flag is mainly used by font validating or + * font editing applications, which need to ignore, verify, or edit + * those tables. + * + * Currently, this flag is only implemented for TrueType fonts. + * + * FT_LOAD_BITMAP_METRICS_ONLY :: + * [Since 2.7.1] Request loading of the metrics and bitmap image + * information of a (possibly embedded) bitmap glyph without allocating + * or copying the bitmap image data itself. No effect if the target + * glyph is not a bitmap image. + * + * This flag unsets @FT_LOAD_RENDER. + * + * FT_LOAD_CROP_BITMAP :: + * Ignored. Deprecated. + * + * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: + * Ignored. Deprecated. + * + * @note: + * By default, hinting is enabled and the font's native hinter (see + * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can + * disable hinting by setting @FT_LOAD_NO_HINTING or change the + * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set + * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be used + * at all. + * + * See the description of @FT_FACE_FLAG_TRICKY for a special exception + * (affecting only a handful of Asian fonts). + * + * Besides deciding which hinter to use, you can also decide which + * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. + * + * Note that the auto-hinter needs a valid Unicode cmap (either a native + * one or synthesized by FreeType) for producing correct results. If a + * font provides an incorrect mapping (for example, assigning the + * character code U+005A, LATIN CAPITAL LETTER~Z, to a glyph depicting a + * mathematical integral sign), the auto-hinter might produce useless + * results. + * + */ +#define FT_LOAD_DEFAULT 0x0 +#define FT_LOAD_NO_SCALE ( 1L << 0 ) +#define FT_LOAD_NO_HINTING ( 1L << 1 ) +#define FT_LOAD_RENDER ( 1L << 2 ) +#define FT_LOAD_NO_BITMAP ( 1L << 3 ) +#define FT_LOAD_VERTICAL_LAYOUT ( 1L << 4 ) +#define FT_LOAD_FORCE_AUTOHINT ( 1L << 5 ) +#define FT_LOAD_CROP_BITMAP ( 1L << 6 ) +#define FT_LOAD_PEDANTIC ( 1L << 7 ) +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ( 1L << 9 ) +#define FT_LOAD_NO_RECURSE ( 1L << 10 ) +#define FT_LOAD_IGNORE_TRANSFORM ( 1L << 11 ) +#define FT_LOAD_MONOCHROME ( 1L << 12 ) +#define FT_LOAD_LINEAR_DESIGN ( 1L << 13 ) +#define FT_LOAD_NO_AUTOHINT ( 1L << 15 ) + /* Bits 16-19 are used by `FT_LOAD_TARGET_` */ +#define FT_LOAD_COLOR ( 1L << 20 ) +#define FT_LOAD_COMPUTE_METRICS ( 1L << 21 ) +#define FT_LOAD_BITMAP_METRICS_ONLY ( 1L << 22 ) + + /* */ + + /* used internally only by certain font drivers */ +#define FT_LOAD_ADVANCE_ONLY ( 1L << 8 ) +#define FT_LOAD_SBITS_ONLY ( 1L << 14 ) + + + /************************************************************************** + * + * @enum: + * FT_LOAD_TARGET_XXX + * + * @description: + * A list of values to select a specific hinting algorithm for the + * hinter. You should OR one of these values to your `load_flags` when + * calling @FT_Load_Glyph. + * + * Note that a font's native hinters may ignore the hinting algorithm you + * have specified (e.g., the TrueType bytecode interpreter). You can set + * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. + * + * @values: + * FT_LOAD_TARGET_NORMAL :: + * The default hinting algorithm, optimized for standard gray-level + * rendering. For monochrome output, use @FT_LOAD_TARGET_MONO instead. + * + * FT_LOAD_TARGET_LIGHT :: + * A lighter hinting algorithm for gray-level modes. Many generated + * glyphs are fuzzier but better resemble their original shape. This + * is achieved by snapping glyphs to the pixel grid only vertically + * (Y-axis), as is done by FreeType's new CFF engine or Microsoft's + * ClearType font renderer. This preserves inter-glyph spacing in + * horizontal text. The snapping is done either by the native font + * driver, if the driver itself and the font support it, or by the + * auto-hinter. + * + * Advance widths are rounded to integer values; however, using the + * `lsb_delta` and `rsb_delta` fields of @FT_GlyphSlotRec, it is + * possible to get fractional advance widths for subpixel positioning + * (which is recommended to use). + * + * If configuration option `AF_CONFIG_OPTION_TT_SIZE_METRICS` is + * active, TrueType-like metrics are used to make this mode behave + * similarly as in unpatched FreeType versions between 2.4.6 and 2.7.1 + * (inclusive). + * + * FT_LOAD_TARGET_MONO :: + * Strong hinting algorithm that should only be used for monochrome + * output. The result is probably unpleasant if the glyph is rendered + * in non-monochrome modes. + * + * Note that for outline fonts only the TrueType font driver has proper + * monochrome hinting support, provided the TTFs contain hints for B/W + * rendering (which most fonts no longer provide). If these conditions + * are not met it is very likely that you get ugly results at smaller + * sizes. + * + * FT_LOAD_TARGET_LCD :: + * A variant of @FT_LOAD_TARGET_LIGHT optimized for horizontally + * decimated LCD displays. + * + * FT_LOAD_TARGET_LCD_V :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically + * decimated LCD displays. + * + * @note: + * You should use only _one_ of the `FT_LOAD_TARGET_XXX` values in your + * `load_flags`. They can't be ORed. + * + * If @FT_LOAD_RENDER is also set, the glyph is rendered in the + * corresponding mode (i.e., the mode that matches the used algorithm + * best). An exception is `FT_LOAD_TARGET_MONO` since it implies + * @FT_LOAD_MONOCHROME. + * + * You can use a hinting algorithm that doesn't correspond to the same + * rendering mode. As an example, it is possible to use the 'light' + * hinting algorithm and have the results rendered in horizontal LCD + * pixel mode, with code like + * + * ``` + * FT_Load_Glyph( face, glyph_index, + * load_flags | FT_LOAD_TARGET_LIGHT ); + * + * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + * ``` + * + * In general, you should stick with one rendering mode. For example, + * switching between @FT_LOAD_TARGET_NORMAL and @FT_LOAD_TARGET_MONO + * enforces a lot of recomputation for TrueType fonts, which is slow. + * Another reason is caching: Selecting a different mode usually causes + * changes in both the outlines and the rasterized bitmaps; it is thus + * necessary to empty the cache after a mode switch to avoid false hits. + * + */ +#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) + +#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) +#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) +#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) +#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) +#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) + + + /************************************************************************** + * + * @macro: + * FT_LOAD_TARGET_MODE + * + * @description: + * Return the @FT_Render_Mode corresponding to a given + * @FT_LOAD_TARGET_XXX value. + * + */ +#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) + + + /************************************************************************** + * + * @function: + * FT_Set_Transform + * + * @description: + * Set the transformation that is applied to glyph images when they are + * loaded into a glyph slot through @FT_Load_Glyph. + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * matrix :: + * A pointer to the transformation's 2x2 matrix. Use `NULL` for the + * identity matrix. + * delta :: + * A pointer to the translation vector. Use `NULL` for the null + * vector. + * + * @note: + * This function is provided as a convenience, but keep in mind that + * @FT_Matrix coefficients are only 16.16 fixed-point values, which can + * limit the accuracy of the results. Using floating-point computations + * to perform the transform directly in client code instead will always + * yield better numbers. + * + * The transformation is only applied to scalable image formats after the + * glyph has been loaded. It means that hinting is unaltered by the + * transformation and is performed on the character size given in the + * last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. + * + * Note that this also transforms the `face.glyph.advance` field, but + * **not** the values in `face.glyph.metrics`. + */ + FT_EXPORT( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /************************************************************************** + * + * @function: + * FT_Get_Transform + * + * @description: + * Return the transformation that is applied to glyph images when they + * are loaded into a glyph slot through @FT_Load_Glyph. See + * @FT_Set_Transform for more details. + * + * @input: + * face :: + * A handle to the source face object. + * + * @output: + * matrix :: + * A pointer to a transformation's 2x2 matrix. Set this to NULL if you + * are not interested in the value. + * + * delta :: + * A pointer a translation vector. Set this to NULL if you are not + * interested in the value. + * + * @since: + * 2.11 + * + */ + FT_EXPORT( void ) + FT_Get_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /************************************************************************** + * + * @enum: + * FT_Render_Mode + * + * @description: + * Render modes supported by FreeType~2. Each mode corresponds to a + * specific type of scanline conversion performed on the outline. + * + * For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode` field + * in the @FT_GlyphSlotRec structure gives the format of the returned + * bitmap. + * + * All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity, + * indicating pixel coverage. Use linear alpha blending and gamma + * correction to correctly render non-monochrome glyph bitmaps onto a + * surface; see @FT_Render_Glyph. + * + * The @FT_RENDER_MODE_SDF is a special render mode that uses up to 256 + * distance values, indicating the signed distance from the grid position + * to the nearest outline. + * + * @values: + * FT_RENDER_MODE_NORMAL :: + * Default render mode; it corresponds to 8-bit anti-aliased bitmaps. + * + * FT_RENDER_MODE_LIGHT :: + * This is equivalent to @FT_RENDER_MODE_NORMAL. It is only defined as + * a separate value because render modes are also used indirectly to + * define hinting algorithm selectors. See @FT_LOAD_TARGET_XXX for + * details. + * + * FT_RENDER_MODE_MONO :: + * This mode corresponds to 1-bit bitmaps (with 2~levels of opacity). + * + * FT_RENDER_MODE_LCD :: + * This mode corresponds to horizontal RGB and BGR subpixel displays + * like LCD screens. It produces 8-bit bitmaps that are 3~times the + * width of the original glyph outline in pixels, and which use the + * @FT_PIXEL_MODE_LCD mode. + * + * FT_RENDER_MODE_LCD_V :: + * This mode corresponds to vertical RGB and BGR subpixel displays + * (like PDA screens, rotated LCD displays, etc.). It produces 8-bit + * bitmaps that are 3~times the height of the original glyph outline in + * pixels and use the @FT_PIXEL_MODE_LCD_V mode. + * + * FT_RENDER_MODE_SDF :: + * This mode corresponds to 8-bit, single-channel signed distance field + * (SDF) bitmaps. Each pixel in the SDF grid is the value from the + * pixel's position to the nearest glyph's outline. The distances are + * calculated from the center of the pixel and are positive if they are + * filled by the outline (i.e., inside the outline) and negative + * otherwise. Check the note below on how to convert the output values + * to usable data. + * + * @note: + * The selected render mode only affects vector glyphs of a font. + * Embedded bitmaps often have a different pixel mode like + * @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform them + * into 8-bit pixmaps. + * + * For @FT_RENDER_MODE_SDF the output bitmap buffer contains normalized + * distances that are packed into unsigned 8-bit values. To get pixel + * values in floating point representation use the following pseudo-C + * code for the conversion. + * + * ``` + * // Load glyph and render using FT_RENDER_MODE_SDF, + * // then use the output buffer as follows. + * + * ... + * FT_Byte buffer = glyph->bitmap->buffer; + * + * + * for pixel in buffer + * { + * // `sd` is the signed distance and `spread` is the current spread; + * // the default spread is 2 and can be changed. + * + * float sd = (float)pixel - 128.0f; + * + * + * // Convert to pixel values. + * sd = ( sd / 128.0f ) * spread; + * + * // Store `sd` in a buffer or use as required. + * } + * + * ``` + */ + typedef enum FT_Render_Mode_ + { + FT_RENDER_MODE_NORMAL = 0, + FT_RENDER_MODE_LIGHT, + FT_RENDER_MODE_MONO, + FT_RENDER_MODE_LCD, + FT_RENDER_MODE_LCD_V, + FT_RENDER_MODE_SDF, + + FT_RENDER_MODE_MAX + + } FT_Render_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Render_Mode` values instead */ +#define ft_render_mode_normal FT_RENDER_MODE_NORMAL +#define ft_render_mode_mono FT_RENDER_MODE_MONO + + + /************************************************************************** + * + * @function: + * FT_Render_Glyph + * + * @description: + * Convert a given glyph image to a bitmap. It does so by inspecting the + * glyph image format, finding the relevant renderer, and invoking it. + * + * @inout: + * slot :: + * A handle to the glyph slot containing the image to convert. + * + * @input: + * render_mode :: + * The render mode used to render the glyph image into a bitmap. See + * @FT_Render_Mode for a list of possible values. + * + * If @FT_RENDER_MODE_NORMAL is used, a previous call of @FT_Load_Glyph + * with flag @FT_LOAD_COLOR makes FT_Render_Glyph provide a default + * blending of colored glyph layers associated with the current glyph + * slot (provided the font contains such layers) instead of rendering + * the glyph slot's outline. This is an experimental feature; see + * @FT_LOAD_COLOR for more information. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * To get meaningful results, font scaling values must be set with + * functions like @FT_Set_Char_Size before calling `FT_Render_Glyph`. + * + * When FreeType outputs a bitmap of a glyph, it really outputs an alpha + * coverage map. If a pixel is completely covered by a filled-in + * outline, the bitmap contains 0xFF at that pixel, meaning that + * 0xFF/0xFF fraction of that pixel is covered, meaning the pixel is 100% + * black (or 0% bright). If a pixel is only 50% covered (value 0x80), + * the pixel is made 50% black (50% bright or a middle shade of grey). + * 0% covered means 0% black (100% bright or white). + * + * On high-DPI screens like on smartphones and tablets, the pixels are so + * small that their chance of being completely covered and therefore + * completely black are fairly good. On the low-DPI screens, however, + * the situation is different. The pixels are too large for most of the + * details of a glyph and shades of gray are the norm rather than the + * exception. + * + * This is relevant because all our screens have a second problem: they + * are not linear. 1~+~1 is not~2. Twice the value does not result in + * twice the brightness. When a pixel is only 50% covered, the coverage + * map says 50% black, and this translates to a pixel value of 128 when + * you use 8~bits per channel (0-255). However, this does not translate + * to 50% brightness for that pixel on our sRGB and gamma~2.2 screens. + * Due to their non-linearity, they dwell longer in the darks and only a + * pixel value of about 186 results in 50% brightness -- 128 ends up too + * dark on both bright and dark backgrounds. The net result is that dark + * text looks burnt-out, pixely and blotchy on bright background, bright + * text too frail on dark backgrounds, and colored text on colored + * background (for example, red on green) seems to have dark halos or + * 'dirt' around it. The situation is especially ugly for diagonal stems + * like in 'w' glyph shapes where the quality of FreeType's anti-aliasing + * depends on the correct display of grays. On high-DPI screens where + * smaller, fully black pixels reign supreme, this doesn't matter, but on + * our low-DPI screens with all the gray shades, it does. 0% and 100% + * brightness are the same things in linear and non-linear space, just + * all the shades in-between aren't. + * + * The blending function for placing text over a background is + * + * ``` + * dst = alpha * src + (1 - alpha) * dst , + * ``` + * + * which is known as the OVER operator. + * + * To correctly composite an anti-aliased pixel of a glyph onto a + * surface, + * + * 1. take the foreground and background colors (e.g., in sRGB space) + * and apply gamma to get them in a linear space, + * + * 2. use OVER to blend the two linear colors using the glyph pixel + * as the alpha value (remember, the glyph bitmap is an alpha coverage + * bitmap), and + * + * 3. apply inverse gamma to the blended pixel and write it back to + * the image. + * + * Internal testing at Adobe found that a target inverse gamma of~1.8 for + * step~3 gives good results across a wide range of displays with an sRGB + * gamma curve or a similar one. + * + * This process can cost performance. There is an approximation that + * does not need to know about the background color; see + * https://bel.fi/alankila/lcd/ and + * https://bel.fi/alankila/lcd/alpcor.html for details. + * + * **ATTENTION**: Linear blending is even more important when dealing + * with subpixel-rendered glyphs to prevent color-fringing! A + * subpixel-rendered glyph must first be filtered with a filter that + * gives equal weight to the three color primaries and does not exceed a + * sum of 0x100, see section @lcd_rendering. Then the only difference to + * gray linear blending is that subpixel-rendered linear blending is done + * 3~times per pixel: red foreground subpixel to red background subpixel + * and so on for green and blue. + */ + FT_EXPORT( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + + /************************************************************************** + * + * @enum: + * FT_Kerning_Mode + * + * @description: + * An enumeration to specify the format of kerning values returned by + * @FT_Get_Kerning. + * + * @values: + * FT_KERNING_DEFAULT :: + * Return grid-fitted kerning distances in 26.6 fractional pixels. + * + * FT_KERNING_UNFITTED :: + * Return un-grid-fitted kerning distances in 26.6 fractional pixels. + * + * FT_KERNING_UNSCALED :: + * Return the kerning vector in original font units. + * + * @note: + * `FT_KERNING_DEFAULT` returns full pixel values; it also makes FreeType + * heuristically scale down kerning distances at small ppem values so + * that they don't become too big. + * + * Both `FT_KERNING_DEFAULT` and `FT_KERNING_UNFITTED` use the current + * horizontal scaling factor (as set e.g. with @FT_Set_Char_Size) to + * convert font units to pixels. + */ + typedef enum FT_Kerning_Mode_ + { + FT_KERNING_DEFAULT = 0, + FT_KERNING_UNFITTED, + FT_KERNING_UNSCALED + + } FT_Kerning_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Kerning_Mode` values instead */ +#define ft_kerning_default FT_KERNING_DEFAULT +#define ft_kerning_unfitted FT_KERNING_UNFITTED +#define ft_kerning_unscaled FT_KERNING_UNSCALED + + + /************************************************************************** + * + * @function: + * FT_Get_Kerning + * + * @description: + * Return the kerning vector between two glyphs of the same face. + * + * @input: + * face :: + * A handle to a source face object. + * + * left_glyph :: + * The index of the left glyph in the kern pair. + * + * right_glyph :: + * The index of the right glyph in the kern pair. + * + * kern_mode :: + * See @FT_Kerning_Mode for more information. Determines the scale and + * dimension of the returned kerning vector. + * + * @output: + * akerning :: + * The kerning vector. This is either in font units, fractional pixels + * (26.6 format), or pixels for scalable formats, and in pixels for + * fixed-sizes formats. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Only horizontal layouts (left-to-right & right-to-left) are supported + * by this method. Other layouts, or more sophisticated kernings, are + * out of the scope of this API function -- they can be implemented + * through format-specific interfaces. + * + * Kerning for OpenType fonts implemented in a 'GPOS' table is not + * supported; use @FT_HAS_KERNING to find out whether a font has data + * that can be extracted with `FT_Get_Kerning`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ); + + + /************************************************************************** + * + * @function: + * FT_Get_Track_Kerning + * + * @description: + * Return the track kerning for a given face object at a given size. + * + * @input: + * face :: + * A handle to a source face object. + * + * point_size :: + * The point size in 16.16 fractional points. + * + * degree :: + * The degree of tightness. Increasingly negative values represent + * tighter track kerning, while increasingly positive values represent + * looser track kerning. Value zero means no track kerning. + * + * @output: + * akerning :: + * The kerning in 16.16 fractional points, to be uniformly applied + * between all glyphs. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Currently, only the Type~1 font driver supports track kerning, using + * data from AFM files (if attached with @FT_Attach_File or + * @FT_Attach_Stream). + * + * Only very few AFM files come with track kerning data; please refer to + * Adobe's AFM specification for more details. + */ + FT_EXPORT( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + + /************************************************************************** + * + * @function: + * FT_Get_Glyph_Name + * + * @description: + * Retrieve the ASCII name of a given glyph in a face. This only works + * for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. + * + * @input: + * face :: + * A handle to a source face object. + * + * glyph_index :: + * The glyph index. + * + * buffer_max :: + * The maximum number of bytes available in the buffer. + * + * @output: + * buffer :: + * A pointer to a target buffer where the name is copied to. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An error is returned if the face doesn't provide glyph names or if the + * glyph index is invalid. In all cases of failure, the first byte of + * `buffer` is set to~0 to indicate an empty name. + * + * The glyph name is truncated to fit within the buffer if it is too + * long. The returned string is always zero-terminated. + * + * Be aware that FreeType reorders glyph indices internally so that glyph + * index~0 always corresponds to the 'missing glyph' (called '.notdef'). + * + * This function always returns an error if the config macro + * `FT_CONFIG_OPTION_NO_GLYPH_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + + /************************************************************************** + * + * @function: + * FT_Get_Postscript_Name + * + * @description: + * Retrieve the ASCII PostScript name of a given face, if available. + * This only works with PostScript, TrueType, and OpenType fonts. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * A pointer to the face's PostScript name. `NULL` if unavailable. + * + * @note: + * The returned pointer is owned by the face and is destroyed with it. + * + * For variation fonts, this string changes if you select a different + * instance, and you have to call `FT_Get_PostScript_Name` again to + * retrieve it. FreeType follows Adobe TechNote #5902, 'Generating + * PostScript Names for Fonts Using OpenType Font Variations'. + * + * https://download.macromedia.com/pub/developer/opentype/tech-notes/5902.AdobePSNameGeneration.html + * + * [Since 2.9] Special PostScript names for named instances are only + * returned if the named instance is set with @FT_Set_Named_Instance (and + * the font has corresponding entries in its 'fvar' table). If + * @FT_IS_VARIATION returns true, the algorithmically derived PostScript + * name is provided, not looking up special entries for named instances. + */ + FT_EXPORT( const char* ) + FT_Get_Postscript_Name( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Select_Charmap + * + * @description: + * Select a given charmap by its encoding tag (as listed in + * `freetype.h`). + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * encoding :: + * A handle to the selected encoding. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function returns an error if no charmap in the face corresponds + * to the encoding queried here. + * + * Because many fonts contain more than a single cmap for Unicode + * encoding, this function has some special code to select the one that + * covers Unicode best ('best' in the sense that a UCS-4 cmap is + * preferred to a UCS-2 cmap). It is thus preferable to @FT_Set_Charmap + * in this case. + */ + FT_EXPORT( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ); + + + /************************************************************************** + * + * @function: + * FT_Set_Charmap + * + * @description: + * Select a given charmap for character code to glyph index mapping. + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * charmap :: + * A handle to the selected charmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function returns an error if the charmap is not part of the face + * (i.e., if it is not listed in the `face->charmaps` table). + * + * It also fails if an OpenType type~14 charmap is selected (which + * doesn't map character codes to glyph indices at all). + */ + FT_EXPORT( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_Charmap_Index + * + * @description: + * Retrieve index of a given charmap. + * + * @input: + * charmap :: + * A handle to a charmap. + * + * @return: + * The index into the array of character maps within the face to which + * `charmap` belongs. If an error occurs, -1 is returned. + * + */ + FT_EXPORT( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_Char_Index + * + * @description: + * Return the glyph index of a given character code. This function uses + * the currently selected charmap to do the mapping. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character code. + * + * @return: + * The glyph index. 0~means 'undefined character code'. + * + * @note: + * If you use FreeType to manipulate the contents of font files directly, + * be aware that the glyph index returned by this function doesn't always + * correspond to the internal indices used within the file. This is done + * to ensure that value~0 always corresponds to the 'missing glyph'. If + * the first glyph is not named '.notdef', then for Type~1 and Type~42 + * fonts, '.notdef' will be moved into the glyph ID~0 position, and + * whatever was there will be moved to the position '.notdef' had. For + * Type~1 fonts, if there is no '.notdef' glyph at all, then one will be + * created at index~0 and whatever was there will be moved to the last + * index -- Type~42 fonts are considered invalid under this condition. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ); + + + /************************************************************************** + * + * @function: + * FT_Get_First_Char + * + * @description: + * Return the first character code in the current charmap of a given + * face, together with its corresponding glyph index. + * + * @input: + * face :: + * A handle to the source face object. + * + * @output: + * agindex :: + * Glyph index of first character code. 0~if charmap is empty. + * + * @return: + * The charmap's first character code. + * + * @note: + * You should use this function together with @FT_Get_Next_Char to parse + * all character codes available in a given charmap. The code should + * look like this: + * + * ``` + * FT_ULong charcode; + * FT_UInt gindex; + * + * + * charcode = FT_Get_First_Char( face, &gindex ); + * while ( gindex != 0 ) + * { + * ... do something with (charcode,gindex) pair ... + * + * charcode = FT_Get_Next_Char( face, charcode, &gindex ); + * } + * ``` + * + * Be aware that character codes can have values up to 0xFFFFFFFF; this + * might happen for non-Unicode or malformed cmaps. However, even with + * regular Unicode encoding, so-called 'last resort fonts' (using SFNT + * cmap format 13, see function @FT_Get_CMap_Format) normally have + * entries for all Unicode characters up to 0x1FFFFF, which can cause *a + * lot* of iterations. + * + * Note that `*agindex` is set to~0 if the charmap is empty. The result + * itself can be~0 in two cases: if the charmap is empty or if the + * value~0 is the first valid character code. + */ + FT_EXPORT( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ); + + + /************************************************************************** + * + * @function: + * FT_Get_Next_Char + * + * @description: + * Return the next character code in the current charmap of a given face + * following the value `char_code`, as well as the corresponding glyph + * index. + * + * @input: + * face :: + * A handle to the source face object. + * + * char_code :: + * The starting character code. + * + * @output: + * agindex :: + * Glyph index of next character code. 0~if charmap is empty. + * + * @return: + * The charmap's next character code. + * + * @note: + * You should use this function with @FT_Get_First_Char to walk over all + * character codes available in a given charmap. See the note for that + * function for a simple code example. + * + * Note that `*agindex` is set to~0 when there are no more codes in the + * charmap. + */ + FT_EXPORT( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong char_code, + FT_UInt *agindex ); + + + /************************************************************************** + * + * @function: + * FT_Face_Properties + * + * @description: + * Set or override certain (library or module-wide) properties on a + * face-by-face basis. Useful for finer-grained control and avoiding + * locks on shared structures (threads can modify their own faces as they + * see fit). + * + * Contrary to @FT_Property_Set, this function uses @FT_Parameter so that + * you can pass multiple properties to the target face in one call. Note + * that only a subset of the available properties can be controlled. + * + * * @FT_PARAM_TAG_STEM_DARKENING (stem darkening, corresponding to the + * property `no-stem-darkening` provided by the 'autofit', 'cff', + * 'type1', and 't1cid' modules; see @no-stem-darkening). + * + * * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (LCD filter weights, corresponding + * to function @FT_Library_SetLcdFilterWeights). + * + * * @FT_PARAM_TAG_RANDOM_SEED (seed value for the CFF, Type~1, and CID + * 'random' operator, corresponding to the `random-seed` property + * provided by the 'cff', 'type1', and 't1cid' modules; see + * @random-seed). + * + * Pass `NULL` as `data` in @FT_Parameter for a given tag to reset the + * option and use the library or module default again. + * + * @input: + * face :: + * A handle to the source face object. + * + * num_properties :: + * The number of properties that follow. + * + * properties :: + * A handle to an @FT_Parameter array with `num_properties` elements. + * + * @return: + * FreeType error code. 0~means success. + * + * @example: + * Here is an example that sets three properties. You must define + * `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` to make the LCD filter examples + * work. + * + * ``` + * FT_Parameter property1; + * FT_Bool darken_stems = 1; + * + * FT_Parameter property2; + * FT_LcdFiveTapFilter custom_weight = + * { 0x11, 0x44, 0x56, 0x44, 0x11 }; + * + * FT_Parameter property3; + * FT_Int32 random_seed = 314159265; + * + * FT_Parameter properties[3] = { property1, + * property2, + * property3 }; + * + * + * property1.tag = FT_PARAM_TAG_STEM_DARKENING; + * property1.data = &darken_stems; + * + * property2.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property2.data = custom_weight; + * + * property3.tag = FT_PARAM_TAG_RANDOM_SEED; + * property3.data = &random_seed; + * + * FT_Face_Properties( face, 3, properties ); + * ``` + * + * The next example resets a single property to its default value. + * + * ``` + * FT_Parameter property; + * + * + * property.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property.data = NULL; + * + * FT_Face_Properties( face, 1, &property ); + * ``` + * + * @since: + * 2.8 + * + */ + FT_EXPORT( FT_Error ) + FT_Face_Properties( FT_Face face, + FT_UInt num_properties, + FT_Parameter* properties ); + + + /************************************************************************** + * + * @function: + * FT_Get_Name_Index + * + * @description: + * Return the glyph index of a given glyph name. + * + * @input: + * face :: + * A handle to the source face object. + * + * glyph_name :: + * The glyph name. + * + * @return: + * The glyph index. 0~means 'undefined character code'. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + const FT_String* glyph_name ); + + + /************************************************************************** + * + * @enum: + * FT_SUBGLYPH_FLAG_XXX + * + * @description: + * A list of constants describing subglyphs. Please refer to the 'glyf' + * table description in the OpenType specification for the meaning of the + * various flags (which get synthesized for non-OpenType subglyphs). + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description + * + * @values: + * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: + * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: + * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: + * FT_SUBGLYPH_FLAG_SCALE :: + * FT_SUBGLYPH_FLAG_XY_SCALE :: + * FT_SUBGLYPH_FLAG_2X2 :: + * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: + * + */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 + + + /************************************************************************** + * + * @function: + * FT_Get_SubGlyph_Info + * + * @description: + * Retrieve a description of a given subglyph. Only use it if + * `glyph->format` is @FT_GLYPH_FORMAT_COMPOSITE; an error is returned + * otherwise. + * + * @input: + * glyph :: + * The source glyph slot. + * + * sub_index :: + * The index of the subglyph. Must be less than + * `glyph->num_subglyphs`. + * + * @output: + * p_index :: + * The glyph index of the subglyph. + * + * p_flags :: + * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. + * + * p_arg1 :: + * The subglyph's first argument (if any). + * + * p_arg2 :: + * The subglyph's second argument (if any). + * + * p_transform :: + * The subglyph transformation (if any). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The values of `*p_arg1`, `*p_arg2`, and `*p_transform` must be + * interpreted depending on the flags returned in `*p_flags`. See the + * OpenType specification for details. + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description + * + */ + FT_EXPORT( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ); + + + /************************************************************************** + * + * @section: + * base_interface + * + */ + + /************************************************************************** + * + * @enum: + * FT_FSTYPE_XXX + * + * @description: + * A list of bit flags used in the `fsType` field of the OS/2 table in a + * TrueType or OpenType font and the `FSType` entry in a PostScript font. + * These bit flags are returned by @FT_Get_FSType_Flags; they inform + * client applications of embedding and subsetting restrictions + * associated with a font. + * + * See + * https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf + * for more details. + * + * @values: + * FT_FSTYPE_INSTALLABLE_EMBEDDING :: + * Fonts with no fsType bit set may be embedded and permanently + * installed on the remote system by an application. + * + * FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: + * Fonts that have only this bit set must not be modified, embedded or + * exchanged in any manner without first obtaining permission of the + * font software copyright owner. + * + * FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: + * The font may be embedded and temporarily loaded on the remote + * system. Documents containing Preview & Print fonts must be opened + * 'read-only'; no edits can be applied to the document. + * + * FT_FSTYPE_EDITABLE_EMBEDDING :: + * The font may be embedded but must only be installed temporarily on + * other systems. In contrast to Preview & Print fonts, documents + * containing editable fonts may be opened for reading, editing is + * permitted, and changes may be saved. + * + * FT_FSTYPE_NO_SUBSETTING :: + * The font may not be subsetted prior to embedding. + * + * FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: + * Only bitmaps contained in the font may be embedded; no outline data + * may be embedded. If there are no bitmaps available in the font, + * then the font is unembeddable. + * + * @note: + * The flags are ORed together, thus more than a single value can be + * returned. + * + * While the `fsType` flags can indicate that a font may be embedded, a + * license with the font vendor may be separately required to use the + * font in this way. + */ +#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 +#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 +#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004 +#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008 +#define FT_FSTYPE_NO_SUBSETTING 0x0100 +#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200 + + + /************************************************************************** + * + * @function: + * FT_Get_FSType_Flags + * + * @description: + * Return the `fsType` flags for a font. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * The `fsType` flags, see @FT_FSTYPE_XXX. + * + * @note: + * Use this function rather than directly reading the `fs_type` field in + * the @PS_FontInfoRec structure, which is only guaranteed to return the + * correct results for Type~1 fonts. + * + * @since: + * 2.3.8 + * + */ + FT_EXPORT( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ); + + + /************************************************************************** + * + * @section: + * glyph_variants + * + * @title: + * Unicode Variation Sequences + * + * @abstract: + * The FreeType~2 interface to Unicode Variation Sequences (UVS), using + * the SFNT cmap format~14. + * + * @description: + * Many characters, especially for CJK scripts, have variant forms. They + * are a sort of grey area somewhere between being totally irrelevant and + * semantically distinct; for this reason, the Unicode consortium decided + * to introduce Variation Sequences (VS), consisting of a Unicode base + * character and a variation selector instead of further extending the + * already huge number of characters. + * + * Unicode maintains two different sets, namely 'Standardized Variation + * Sequences' and registered 'Ideographic Variation Sequences' (IVS), + * collected in the 'Ideographic Variation Database' (IVD). + * + * https://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt + * https://unicode.org/reports/tr37/ https://unicode.org/ivd/ + * + * To date (January 2017), the character with the most ideographic + * variations is U+9089, having 32 such IVS. + * + * Three Mongolian Variation Selectors have the values U+180B-U+180D; 256 + * generic Variation Selectors are encoded in the ranges U+FE00-U+FE0F + * and U+E0100-U+E01EF. IVS currently use Variation Selectors from the + * range U+E0100-U+E01EF only. + * + * A VS consists of the base character value followed by a single + * Variation Selector. For example, to get the first variation of + * U+9089, you have to write the character sequence `U+9089 U+E0100`. + * + * Adobe and MS decided to support both standardized and ideographic VS + * with a new cmap subtable (format~14). It is an odd subtable because + * it is not a mapping of input code points to glyphs, but contains lists + * of all variations supported by the font. + * + * A variation may be either 'default' or 'non-default' for a given font. + * A default variation is the one you will get for that code point if you + * look it up in the standard Unicode cmap. A non-default variation is a + * different glyph. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharVariantIndex + * + * @description: + * Return the glyph index of a given character code as modified by the + * variation selector. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character code point in Unicode. + * + * variantSelector :: + * The Unicode code point of the variation selector. + * + * @return: + * The glyph index. 0~means either 'undefined character code', or + * 'undefined selector code', or 'no variation selector cmap subtable', + * or 'current CharMap is not Unicode'. + * + * @note: + * If you use FreeType to manipulate the contents of font files directly, + * be aware that the glyph index returned by this function doesn't always + * correspond to the internal indices used within the file. This is done + * to ensure that value~0 always corresponds to the 'missing glyph'. + * + * This function is only meaningful if + * a) the font has a variation selector cmap sub table, and + * b) the current charmap has a Unicode encoding. + * + * @since: + * 2.3.6 + * + */ + FT_EXPORT( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharVariantIsDefault + * + * @description: + * Check whether this variation of this Unicode character is the one to + * be found in the charmap. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character codepoint in Unicode. + * + * variantSelector :: + * The Unicode codepoint of the variation selector. + * + * @return: + * 1~if found in the standard (Unicode) cmap, 0~if found in the variation + * selector cmap, or -1 if it is not a variation. + * + * @note: + * This function is only meaningful if the font has a variation selector + * cmap subtable. + * + * @since: + * 2.3.6 + * + */ + FT_EXPORT( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetVariantSelectors + * + * @description: + * Return a zero-terminated list of Unicode variation selectors found in + * the font. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * A pointer to an array of selector code points, or `NULL` if there is + * no valid variation selector cmap subtable. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + * + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetVariantsOfChar + * + * @description: + * Return a zero-terminated list of Unicode variation selectors found for + * the specified character code. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character codepoint in Unicode. + * + * @return: + * A pointer to an array of variation selector code points that are + * active for the given character, or `NULL` if the corresponding list is + * empty. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + * + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharsOfVariant + * + * @description: + * Return a zero-terminated list of Unicode character codes found for the + * specified variation selector. + * + * @input: + * face :: + * A handle to the source face object. + * + * variantSelector :: + * The variation selector code point in Unicode. + * + * @return: + * A list of all the code points that are specified by this selector + * (both default and non-default codes are returned) or `NULL` if there + * is no valid cmap or the variation selector is invalid. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + * + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @section: + * computations + * + * @title: + * Computations + * + * @abstract: + * Crunching fixed numbers and vectors. + * + * @description: + * This section contains various functions used to perform computations + * on 16.16 fixed-float numbers or 2d vectors. + * + * **Attention**: Most arithmetic functions take `FT_Long` as arguments. + * For historical reasons, FreeType was designed under the assumption + * that `FT_Long` is a 32-bit integer; results can thus be undefined if + * the arguments don't fit into 32 bits. + * + * @order: + * FT_MulDiv + * FT_MulFix + * FT_DivFix + * FT_RoundFix + * FT_CeilFix + * FT_FloorFix + * FT_Vector_Transform + * FT_Matrix_Multiply + * FT_Matrix_Invert + * + */ + + + /************************************************************************** + * + * @function: + * FT_MulDiv + * + * @description: + * Compute `(a*b)/c` with maximum accuracy, using a 64-bit intermediate + * integer whenever necessary. + * + * This function isn't necessarily as fast as some processor-specific + * operations, but is at least completely portable. + * + * @input: + * a :: + * The first multiplier. + * + * b :: + * The second multiplier. + * + * c :: + * The divisor. + * + * @return: + * The result of `(a*b)/c`. This function never traps when trying to + * divide by zero; it simply returns 'MaxInt' or 'MinInt' depending on + * the signs of `a` and `b`. + */ + FT_EXPORT( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ); + + + /************************************************************************** + * + * @function: + * FT_MulFix + * + * @description: + * Compute `(a*b)/0x10000` with maximum accuracy. Its main use is to + * multiply a given value by a 16.16 fixed-point factor. + * + * @input: + * a :: + * The first multiplier. + * + * b :: + * The second multiplier. Use a 16.16 factor here whenever possible + * (see note below). + * + * @return: + * The result of `(a*b)/0x10000`. + * + * @note: + * This function has been optimized for the case where the absolute value + * of `a` is less than 2048, and `b` is a 16.16 scaling factor. As this + * happens mainly when scaling from notional units to fractional pixels + * in FreeType, it resulted in noticeable speed improvements between + * versions 2.x and 1.x. + * + * As a conclusion, always try to place a 16.16 factor as the _second_ + * argument of this function; this can make a great difference. + */ + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); + + + /************************************************************************** + * + * @function: + * FT_DivFix + * + * @description: + * Compute `(a*0x10000)/b` with maximum accuracy. Its main use is to + * divide a given value by a 16.16 fixed-point factor. + * + * @input: + * a :: + * The numerator. + * + * b :: + * The denominator. Use a 16.16 factor here. + * + * @return: + * The result of `(a*0x10000)/b`. + */ + FT_EXPORT( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ); + + + /************************************************************************** + * + * @function: + * FT_RoundFix + * + * @description: + * Round a 16.16 fixed number. + * + * @input: + * a :: + * The number to be rounded. + * + * @return: + * `a` rounded to the nearest 16.16 fixed integer, halfway cases away + * from zero. + * + * @note: + * The function uses wrap-around arithmetic. + */ + FT_EXPORT( FT_Fixed ) + FT_RoundFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_CeilFix + * + * @description: + * Compute the smallest following integer of a 16.16 fixed number. + * + * @input: + * a :: + * The number for which the ceiling function is to be computed. + * + * @return: + * `a` rounded towards plus infinity. + * + * @note: + * The function uses wrap-around arithmetic. + */ + FT_EXPORT( FT_Fixed ) + FT_CeilFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_FloorFix + * + * @description: + * Compute the largest previous integer of a 16.16 fixed number. + * + * @input: + * a :: + * The number for which the floor function is to be computed. + * + * @return: + * `a` rounded towards minus infinity. + */ + FT_EXPORT( FT_Fixed ) + FT_FloorFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Transform + * + * @description: + * Transform a single vector through a 2x2 matrix. + * + * @inout: + * vector :: + * The target vector to transform. + * + * @input: + * matrix :: + * A pointer to the source 2x2 matrix. + * + * @note: + * The result is undefined if either `vector` or `matrix` is invalid. + */ + FT_EXPORT( void ) + FT_Vector_Transform( FT_Vector* vector, + const FT_Matrix* matrix ); + + + /************************************************************************** + * + * @section: + * version + * + * @title: + * FreeType Version + * + * @abstract: + * Functions and macros related to FreeType versions. + * + * @description: + * Note that those functions and macros are of limited use because even a + * new release of FreeType with only documentation changes increases the + * version number. + * + * @order: + * FT_Library_Version + * + * FREETYPE_MAJOR + * FREETYPE_MINOR + * FREETYPE_PATCH + * + * FT_Face_CheckTrueTypePatents + * FT_Face_SetUnpatentedHinting + * + */ + + + /************************************************************************** + * + * @enum: + * FREETYPE_XXX + * + * @description: + * These three macros identify the FreeType source code version. Use + * @FT_Library_Version to access them at runtime. + * + * @values: + * FREETYPE_MAJOR :: + * The major version number. + * FREETYPE_MINOR :: + * The minor version number. + * FREETYPE_PATCH :: + * The patch level. + * + * @note: + * The version number of FreeType if built as a dynamic link library with + * the 'libtool' package is _not_ controlled by these three macros. + * + */ +#define FREETYPE_MAJOR 2 +#define FREETYPE_MINOR 11 +#define FREETYPE_PATCH 0 + + + /************************************************************************** + * + * @function: + * FT_Library_Version + * + * @description: + * Return the version of the FreeType library being used. This is useful + * when dynamically linking to the library, since one cannot use the + * macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and @FREETYPE_PATCH. + * + * @input: + * library :: + * A source library handle. + * + * @output: + * amajor :: + * The major version number. + * + * aminor :: + * The minor version number. + * + * apatch :: + * The patch version number. + * + * @note: + * The reason why this function takes a `library` argument is because + * certain programs implement library initialization in a custom way that + * doesn't use @FT_Init_FreeType. + * + * In such cases, the library version might not be available before the + * library object has been created. + */ + FT_EXPORT( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ); + + + /************************************************************************** + * + * @function: + * FT_Face_CheckTrueTypePatents + * + * @description: + * Deprecated, does nothing. + * + * @input: + * face :: + * A face handle. + * + * @return: + * Always returns false. + * + * @note: + * Since May 2010, TrueType hinting is no longer patented. + * + * @since: + * 2.3.5 + * + */ + FT_EXPORT( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Face_SetUnpatentedHinting + * + * @description: + * Deprecated, does nothing. + * + * @input: + * face :: + * A face handle. + * + * value :: + * New boolean setting. + * + * @return: + * Always returns false. + * + * @note: + * Since May 2010, TrueType hinting is no longer patented. + * + * @since: + * 2.3.5 + * + */ + FT_EXPORT( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ); + + /* */ + + +FT_END_HEADER + +#endif /* FREETYPE_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftadvanc.h b/NothinFancy/dep/include/freetype/ftadvanc.h new file mode 100644 index 0000000..3a13bd3 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftadvanc.h @@ -0,0 +1,188 @@ +/**************************************************************************** + * + * ftadvanc.h + * + * Quick computation of advance widths (specification only). + * + * Copyright (C) 2008-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTADVANC_H_ +#define FTADVANC_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * quick_advance + * + * @title: + * Quick retrieval of advance values + * + * @abstract: + * Retrieve horizontal and vertical advance values without processing + * glyph outlines, if possible. + * + * @description: + * This section contains functions to quickly extract advance values + * without handling glyph outlines, if possible. + * + * @order: + * FT_Get_Advance + * FT_Get_Advances + * + */ + + + /************************************************************************** + * + * @enum: + * FT_ADVANCE_FLAG_FAST_ONLY + * + * @description: + * A bit-flag to be OR-ed with the `flags` parameter of the + * @FT_Get_Advance and @FT_Get_Advances functions. + * + * If set, it indicates that you want these functions to fail if the + * corresponding hinting mode or font driver doesn't allow for very quick + * advance computation. + * + * Typically, glyphs that are either unscaled, unhinted, bitmapped, or + * light-hinted can have their advance width computed very quickly. + * + * Normal and bytecode hinted modes that require loading, scaling, and + * hinting of the glyph outline, are extremely slow by comparison. + */ +#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000L + + + /************************************************************************** + * + * @function: + * FT_Get_Advance + * + * @description: + * Retrieve the advance value of a given glyph outline in an @FT_Face. + * + * @input: + * face :: + * The source @FT_Face handle. + * + * gindex :: + * The glyph index. + * + * load_flags :: + * A set of bit flags similar to those used when calling + * @FT_Load_Glyph, used to determine what kind of advances you need. + * + * @output: + * padvance :: + * The advance value. If scaling is performed (based on the value of + * `load_flags`), the advance value is in 16.16 format. Otherwise, it + * is in font units. + * + * If @FT_LOAD_VERTICAL_LAYOUT is set, this is the vertical advance + * corresponding to a vertical layout. Otherwise, it is the horizontal + * advance in a horizontal layout. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and if + * the corresponding font backend doesn't have a quick way to retrieve + * the advances. + * + * A scaled advance is returned in 16.16 format but isn't transformed by + * the affine transformation specified by @FT_Set_Transform. + */ + FT_EXPORT( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 load_flags, + FT_Fixed *padvance ); + + + /************************************************************************** + * + * @function: + * FT_Get_Advances + * + * @description: + * Retrieve the advance values of several glyph outlines in an @FT_Face. + * + * @input: + * face :: + * The source @FT_Face handle. + * + * start :: + * The first glyph index. + * + * count :: + * The number of advance values you want to retrieve. + * + * load_flags :: + * A set of bit flags similar to those used when calling + * @FT_Load_Glyph. + * + * @output: + * padvance :: + * The advance values. This array, to be provided by the caller, must + * contain at least `count` elements. + * + * If scaling is performed (based on the value of `load_flags`), the + * advance values are in 16.16 format. Otherwise, they are in font + * units. + * + * If @FT_LOAD_VERTICAL_LAYOUT is set, these are the vertical advances + * corresponding to a vertical layout. Otherwise, they are the + * horizontal advances in a horizontal layout. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and if + * the corresponding font backend doesn't have a quick way to retrieve + * the advances. + * + * Scaled advances are returned in 16.16 format but aren't transformed by + * the affine transformation specified by @FT_Set_Transform. + */ + FT_EXPORT( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 load_flags, + FT_Fixed *padvances ); + + /* */ + + +FT_END_HEADER + +#endif /* FTADVANC_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftbbox.h b/NothinFancy/dep/include/freetype/ftbbox.h new file mode 100644 index 0000000..713aedb --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftbbox.h @@ -0,0 +1,101 @@ +/**************************************************************************** + * + * ftbbox.h + * + * FreeType exact bbox computation (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This component has a _single_ role: to compute exact outline bounding + * boxes. + * + * It is separated from the rest of the engine for various technical + * reasons. It may well be integrated in 'ftoutln' later. + * + */ + + +#ifndef FTBBOX_H_ +#define FTBBOX_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * outline_processing + * + */ + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_BBox + * + * @description: + * Compute the exact bounding box of an outline. This is slower than + * computing the control box. However, it uses an advanced algorithm + * that returns _very_ quickly when the two boxes coincide. Otherwise, + * the outline Bezier arcs are traversed to extract their extrema. + * + * @input: + * outline :: + * A pointer to the source outline. + * + * @output: + * abbox :: + * The outline's exact bounding box. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the font is tricky and the glyph has been loaded with + * @FT_LOAD_NO_SCALE, the resulting BBox is meaningless. To get + * reasonable values for the BBox it is necessary to load the glyph at a + * large ppem value (so that the hinting instructions can properly shift + * and scale the subglyphs), then extracting the BBox, which can be + * eventually converted back to font units. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ); + + /* */ + + +FT_END_HEADER + +#endif /* FTBBOX_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/NothinFancy/dep/include/freetype/ftbdf.h b/NothinFancy/dep/include/freetype/ftbdf.h new file mode 100644 index 0000000..c428506 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftbdf.h @@ -0,0 +1,212 @@ +/**************************************************************************** + * + * ftbdf.h + * + * FreeType API for accessing BDF-specific strings (specification). + * + * Copyright (C) 2002-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBDF_H_ +#define FTBDF_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * bdf_fonts + * + * @title: + * BDF and PCF Files + * + * @abstract: + * BDF and PCF specific API. + * + * @description: + * This section contains the declaration of functions specific to BDF and + * PCF fonts. + * + */ + + + /************************************************************************** + * + * @enum: + * BDF_PropertyType + * + * @description: + * A list of BDF property types. + * + * @values: + * BDF_PROPERTY_TYPE_NONE :: + * Value~0 is used to indicate a missing property. + * + * BDF_PROPERTY_TYPE_ATOM :: + * Property is a string atom. + * + * BDF_PROPERTY_TYPE_INTEGER :: + * Property is a 32-bit signed integer. + * + * BDF_PROPERTY_TYPE_CARDINAL :: + * Property is a 32-bit unsigned integer. + */ + typedef enum BDF_PropertyType_ + { + BDF_PROPERTY_TYPE_NONE = 0, + BDF_PROPERTY_TYPE_ATOM = 1, + BDF_PROPERTY_TYPE_INTEGER = 2, + BDF_PROPERTY_TYPE_CARDINAL = 3 + + } BDF_PropertyType; + + + /************************************************************************** + * + * @type: + * BDF_Property + * + * @description: + * A handle to a @BDF_PropertyRec structure to model a given BDF/PCF + * property. + */ + typedef struct BDF_PropertyRec_* BDF_Property; + + + /************************************************************************** + * + * @struct: + * BDF_PropertyRec + * + * @description: + * This structure models a given BDF/PCF property. + * + * @fields: + * type :: + * The property type. + * + * u.atom :: + * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. May be + * `NULL`, indicating an empty string. + * + * u.integer :: + * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. + * + * u.cardinal :: + * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. + */ + typedef struct BDF_PropertyRec_ + { + BDF_PropertyType type; + union { + const char* atom; + FT_Int32 integer; + FT_UInt32 cardinal; + + } u; + + } BDF_PropertyRec; + + + /************************************************************************** + * + * @function: + * FT_Get_BDF_Charset_ID + * + * @description: + * Retrieve a BDF font character set identity, according to the BDF + * specification. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * acharset_encoding :: + * Charset encoding, as a C~string, owned by the face. + * + * acharset_registry :: + * Charset registry, as a C~string, owned by the face. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with BDF faces, returning an error otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + + /************************************************************************** + * + * @function: + * FT_Get_BDF_Property + * + * @description: + * Retrieve a BDF property from a BDF or PCF font file. + * + * @input: + * face :: + * A handle to the input face. + * + * name :: + * The property name. + * + * @output: + * aproperty :: + * The property. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function works with BDF _and_ PCF fonts. It returns an error + * otherwise. It also returns an error if the property is not in the + * font. + * + * A 'property' is a either key-value pair within the STARTPROPERTIES + * ... ENDPROPERTIES block of a BDF font or a key-value pair from the + * `info->props` array within a `FontRec` structure of a PCF font. + * + * Integer properties are always stored as 'signed' within PCF fonts; + * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value + * for BDF fonts only. + * + * In case of error, `aproperty->type` is always set to + * @BDF_PROPERTY_TYPE_NONE. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + /* */ + +FT_END_HEADER + +#endif /* FTBDF_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftbitmap.h b/NothinFancy/dep/include/freetype/ftbitmap.h new file mode 100644 index 0000000..11c45b0 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftbitmap.h @@ -0,0 +1,329 @@ +/**************************************************************************** + * + * ftbitmap.h + * + * FreeType utility functions for bitmaps (specification). + * + * Copyright (C) 2004-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBITMAP_H_ +#define FTBITMAP_H_ + + +#include +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * bitmap_handling + * + * @title: + * Bitmap Handling + * + * @abstract: + * Handling FT_Bitmap objects. + * + * @description: + * This section contains functions for handling @FT_Bitmap objects, + * automatically adjusting the target's bitmap buffer size as needed. + * + * Note that none of the functions changes the bitmap's 'flow' (as + * indicated by the sign of the `pitch` field in @FT_Bitmap). + * + * To set the flow, assign an appropriate positive or negative value to + * the `pitch` field of the target @FT_Bitmap object after calling + * @FT_Bitmap_Init but before calling any of the other functions + * described here. + */ + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Init + * + * @description: + * Initialize a pointer to an @FT_Bitmap structure. + * + * @inout: + * abitmap :: + * A pointer to the bitmap structure. + * + * @note: + * A deprecated name for the same function is `FT_Bitmap_New`. + */ + FT_EXPORT( void ) + FT_Bitmap_Init( FT_Bitmap *abitmap ); + + + /* deprecated */ + FT_EXPORT( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Copy + * + * @description: + * Copy a bitmap into another one. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * A handle to the source bitmap. + * + * @output: + * target :: + * A handle to the target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Embolden + * + * @description: + * Embolden a bitmap. The new bitmap will be about `xStrength` pixels + * wider and `yStrength` pixels higher. The left and bottom borders are + * kept unchanged. + * + * @input: + * library :: + * A handle to a library object. + * + * xStrength :: + * How strong the glyph is emboldened horizontally. Expressed in 26.6 + * pixel format. + * + * yStrength :: + * How strong the glyph is emboldened vertically. Expressed in 26.6 + * pixel format. + * + * @inout: + * bitmap :: + * A handle to the target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The current implementation restricts `xStrength` to be less than or + * equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. + * + * If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, you + * should call @FT_GlyphSlot_Own_Bitmap on the slot first. + * + * Bitmaps in @FT_PIXEL_MODE_GRAY2 and @FT_PIXEL_MODE_GRAY@ format are + * converted to @FT_PIXEL_MODE_GRAY format (i.e., 8bpp). + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Convert + * + * @description: + * Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp to + * a bitmap object with depth 8bpp, making the number of used bytes per + * line (a.k.a. the 'pitch') a multiple of `alignment`. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * The source bitmap. + * + * alignment :: + * The pitch of the bitmap is a multiple of this argument. Common + * values are 1, 2, or 4. + * + * @output: + * target :: + * The target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * It is possible to call @FT_Bitmap_Convert multiple times without + * calling @FT_Bitmap_Done (the memory is simply reallocated). + * + * Use @FT_Bitmap_Done to finally remove the bitmap object. + * + * The `library` argument is taken to have access to FreeType's memory + * handling functions. + * + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Blend + * + * @description: + * Blend a bitmap onto another bitmap, using a given color. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * The source bitmap, which can have any @FT_Pixel_Mode format. + * + * source_offset :: + * The offset vector to the upper left corner of the source bitmap in + * 26.6 pixel format. It should represent an integer offset; the + * function will set the lowest six bits to zero to enforce that. + * + * color :: + * The color used to draw `source` onto `target`. + * + * @inout: + * target :: + * A handle to an `FT_Bitmap` object. It should be either initialized + * as empty with a call to @FT_Bitmap_Init, or it should be of type + * @FT_PIXEL_MODE_BGRA. + * + * atarget_offset :: + * The offset vector to the upper left corner of the target bitmap in + * 26.6 pixel format. It should represent an integer offset; the + * function will set the lowest six bits to zero to enforce that. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function doesn't perform clipping. + * + * The bitmap in `target` gets allocated or reallocated as needed; the + * vector `atarget_offset` is updated accordingly. + * + * In case of allocation or reallocation, the bitmap's pitch is set to + * `4 * width`. Both `source` and `target` must have the same bitmap + * flow (as indicated by the sign of the `pitch` field). + * + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Blend( FT_Library library, + const FT_Bitmap* source, + const FT_Vector source_offset, + FT_Bitmap* target, + FT_Vector *atarget_offset, + FT_Color color ); + + + /************************************************************************** + * + * @function: + * FT_GlyphSlot_Own_Bitmap + * + * @description: + * Make sure that a glyph slot owns `slot->bitmap`. + * + * @input: + * slot :: + * The glyph slot. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is to be used in combination with @FT_Bitmap_Embolden. + */ + FT_EXPORT( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Done + * + * @description: + * Destroy a bitmap object initialized with @FT_Bitmap_Init. + * + * @input: + * library :: + * A handle to a library object. + * + * bitmap :: + * The bitmap object to be freed. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `library` argument is taken to have access to FreeType's memory + * handling functions. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTBITMAP_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftbzip2.h b/NothinFancy/dep/include/freetype/ftbzip2.h new file mode 100644 index 0000000..afd2a82 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftbzip2.h @@ -0,0 +1,102 @@ +/**************************************************************************** + * + * ftbzip2.h + * + * Bzip2-compressed stream support. + * + * Copyright (C) 2010-2021 by + * Joel Klinghed. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBZIP2_H_ +#define FTBZIP2_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * bzip2 + * + * @title: + * BZIP2 Streams + * + * @abstract: + * Using bzip2-compressed font files. + * + * @description: + * In certain builds of the library, bzip2 compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a bzip2 compressed + * stream from it and re-open the face with it. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream, + * which significantly undermines the performance. + * + * This section contains the declaration of Bzip2-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Stream_OpenBzip2 + * + * @description: + * Open a new stream to parse bzip2-compressed font files. This is + * mainly used to support the compressed `*.pcf.bz2` fonts that come with + * XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with bzip2 support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenBzip2( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* FTBZIP2_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftcache.h b/NothinFancy/dep/include/freetype/ftcache.h new file mode 100644 index 0000000..70399a3 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftcache.h @@ -0,0 +1,1087 @@ +/**************************************************************************** + * + * ftcache.h + * + * FreeType Cache subsystem (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCACHE_H_ +#define FTCACHE_H_ + + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * cache_subsystem + * + * @title: + * Cache Sub-System + * + * @abstract: + * How to cache face, size, and glyph data with FreeType~2. + * + * @description: + * This section describes the FreeType~2 cache sub-system, which is used + * to limit the number of concurrently opened @FT_Face and @FT_Size + * objects, as well as caching information like character maps and glyph + * images while limiting their maximum memory usage. + * + * Note that all types and functions begin with the `FTC_` prefix. + * + * The cache is highly portable and thus doesn't know anything about the + * fonts installed on your system, or how to access them. This implies + * the following scheme: + * + * First, available or installed font faces are uniquely identified by + * @FTC_FaceID values, provided to the cache by the client. Note that + * the cache only stores and compares these values, and doesn't try to + * interpret them in any way. + * + * Second, the cache calls, only when needed, a client-provided function + * to convert an @FTC_FaceID into a new @FT_Face object. The latter is + * then completely managed by the cache, including its termination + * through @FT_Done_Face. To monitor termination of face objects, the + * finalizer callback in the `generic` field of the @FT_Face object can + * be used, which might also be used to store the @FTC_FaceID of the + * face. + * + * Clients are free to map face IDs to anything else. The most simple + * usage is to associate them to a (pathname,face_index) pair that is + * used to call @FT_New_Face. However, more complex schemes are also + * possible. + * + * Note that for the cache to work correctly, the face ID values must be + * **persistent**, which means that the contents they point to should not + * change at runtime, or that their value should not become invalid. + * + * If this is unavoidable (e.g., when a font is uninstalled at runtime), + * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let + * the cache get rid of any references to the old @FTC_FaceID it may keep + * internally. Failure to do so will lead to incorrect behaviour or even + * crashes. + * + * To use the cache, start with calling @FTC_Manager_New to create a new + * @FTC_Manager object, which models a single cache instance. You can + * then look up @FT_Face and @FT_Size objects with + * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. + * + * If you want to use the charmap caching, call @FTC_CMapCache_New, then + * later use @FTC_CMapCache_Lookup to perform the equivalent of + * @FT_Get_Char_Index, only much faster. + * + * If you want to use the @FT_Glyph caching, call @FTC_ImageCache_New, + * then later use @FTC_ImageCache_Lookup to retrieve the corresponding + * @FT_Glyph objects from the cache. + * + * If you need lots of small bitmaps, it is much more memory efficient to + * call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This + * returns @FTC_SBitRec structures, which are used to store small bitmaps + * directly. (A small bitmap is one whose metrics and dimensions all fit + * into 8-bit integers). + * + * We hope to also provide a kerning cache in the near future. + * + * + * @order: + * FTC_Manager + * FTC_FaceID + * FTC_Face_Requester + * + * FTC_Manager_New + * FTC_Manager_Reset + * FTC_Manager_Done + * FTC_Manager_LookupFace + * FTC_Manager_LookupSize + * FTC_Manager_RemoveFaceID + * + * FTC_Node + * FTC_Node_Unref + * + * FTC_ImageCache + * FTC_ImageCache_New + * FTC_ImageCache_Lookup + * + * FTC_SBit + * FTC_SBitCache + * FTC_SBitCache_New + * FTC_SBitCache_Lookup + * + * FTC_CMapCache + * FTC_CMapCache_New + * FTC_CMapCache_Lookup + * + *************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC TYPE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FTC_FaceID + * + * @description: + * An opaque pointer type that is used to identity face objects. The + * contents of such objects is application-dependent. + * + * These pointers are typically used to point to a user-defined structure + * containing a font file path, and face index. + * + * @note: + * Never use `NULL` as a valid @FTC_FaceID. + * + * Face IDs are passed by the client to the cache manager that calls, + * when needed, the @FTC_Face_Requester to translate them into new + * @FT_Face objects. + * + * If the content of a given face ID changes at runtime, or if the value + * becomes invalid (e.g., when uninstalling a font), you should + * immediately call @FTC_Manager_RemoveFaceID before any other cache + * function. + * + * Failure to do so will result in incorrect behaviour or even memory + * leaks and crashes. + */ + typedef FT_Pointer FTC_FaceID; + + + /************************************************************************** + * + * @functype: + * FTC_Face_Requester + * + * @description: + * A callback function provided by client applications. It is used by + * the cache manager to translate a given @FTC_FaceID into a new valid + * @FT_Face object, on demand. + * + * @input: + * face_id :: + * The face ID to resolve. + * + * library :: + * A handle to a FreeType library object. + * + * req_data :: + * Application-provided request data (see note below). + * + * @output: + * aface :: + * A new @FT_Face handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The third parameter `req_data` is the same as the one passed by the + * client when @FTC_Manager_New is called. + * + * The face requester should not perform funny things on the returned + * face object, like creating a new @FT_Size for it, or setting a + * transformation through @FT_Set_Transform! + */ + typedef FT_Error + (*FTC_Face_Requester)( FTC_FaceID face_id, + FT_Library library, + FT_Pointer req_data, + FT_Face* aface ); + + /* */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FTC_Manager + * + * @description: + * This object corresponds to one instance of the cache-subsystem. It is + * used to cache one or more @FT_Face objects, along with corresponding + * @FT_Size objects. + * + * The manager intentionally limits the total number of opened @FT_Face + * and @FT_Size objects to control memory usage. See the `max_faces` and + * `max_sizes` parameters of @FTC_Manager_New. + * + * The manager is also used to cache 'nodes' of various types while + * limiting their total memory usage. + * + * All limitations are enforced by keeping lists of managed objects in + * most-recently-used order, and flushing old nodes to make room for new + * ones. + */ + typedef struct FTC_ManagerRec_* FTC_Manager; + + + /************************************************************************** + * + * @type: + * FTC_Node + * + * @description: + * An opaque handle to a cache node object. Each cache node is + * reference-counted. A node with a count of~0 might be flushed out of a + * full cache whenever a lookup request is performed. + * + * If you look up nodes, you have the ability to 'acquire' them, i.e., to + * increment their reference count. This will prevent the node from + * being flushed out of the cache until you explicitly 'release' it (see + * @FTC_Node_Unref). + * + * See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. + */ + typedef struct FTC_NodeRec_* FTC_Node; + + + /************************************************************************** + * + * @function: + * FTC_Manager_New + * + * @description: + * Create a new cache manager. + * + * @input: + * library :: + * The parent FreeType library handle to use. + * + * max_faces :: + * Maximum number of opened @FT_Face objects managed by this cache + * instance. Use~0 for defaults. + * + * max_sizes :: + * Maximum number of opened @FT_Size objects managed by this cache + * instance. Use~0 for defaults. + * + * max_bytes :: + * Maximum number of bytes to use for cached data nodes. Use~0 for + * defaults. Note that this value does not account for managed + * @FT_Face and @FT_Size objects. + * + * requester :: + * An application-provided callback used to translate face IDs into + * real @FT_Face objects. + * + * req_data :: + * A generic pointer that is passed to the requester each time it is + * called (see @FTC_Face_Requester). + * + * @output: + * amanager :: + * A handle to a new manager object. 0~in case of failure. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_Reset + * + * @description: + * Empty a given cache manager. This simply gets rid of all the + * currently cached @FT_Face and @FT_Size objects within the manager. + * + * @inout: + * manager :: + * A handle to the manager. + */ + FT_EXPORT( void ) + FTC_Manager_Reset( FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_Done + * + * @description: + * Destroy a given manager after emptying it. + * + * @input: + * manager :: + * A handle to the target cache manager object. + */ + FT_EXPORT( void ) + FTC_Manager_Done( FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_LookupFace + * + * @description: + * Retrieve the @FT_Face object that corresponds to a given face ID + * through a cache manager. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * face_id :: + * The ID of the face object. + * + * @output: + * aface :: + * A handle to the face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned @FT_Face object is always owned by the manager. You + * should never try to discard it yourself. + * + * The @FT_Face object doesn't necessarily have a current size object + * (i.e., face->size can be~0). If you need a specific 'font size', use + * @FTC_Manager_LookupSize instead. + * + * Never change the face's transformation matrix (i.e., never call the + * @FT_Set_Transform function) on a returned face! If you need to + * transform glyphs, do it yourself after glyph loading. + * + * When you perform a lookup, out-of-memory errors are detected _within_ + * the lookup and force incremental flushes of the cache until enough + * memory is released for the lookup to succeed. + * + * If a lookup fails with `FT_Err_Out_Of_Memory` the cache has already + * been completely flushed, and still no memory was available for the + * operation. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /************************************************************************** + * + * @struct: + * FTC_ScalerRec + * + * @description: + * A structure used to describe a given character size in either pixels + * or points to the cache manager. See @FTC_Manager_LookupSize. + * + * @fields: + * face_id :: + * The source face ID. + * + * width :: + * The character width. + * + * height :: + * The character height. + * + * pixel :: + * A Boolean. If 1, the `width` and `height` fields are interpreted as + * integer pixel character sizes. Otherwise, they are expressed as + * 1/64th of points. + * + * x_res :: + * Only used when `pixel` is value~0 to indicate the horizontal + * resolution in dpi. + * + * y_res :: + * Only used when `pixel` is value~0 to indicate the vertical + * resolution in dpi. + * + * @note: + * This type is mainly used to retrieve @FT_Size objects through the + * cache manager. + */ + typedef struct FTC_ScalerRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int pixel; + FT_UInt x_res; + FT_UInt y_res; + + } FTC_ScalerRec; + + + /************************************************************************** + * + * @struct: + * FTC_Scaler + * + * @description: + * A handle to an @FTC_ScalerRec structure. + */ + typedef struct FTC_ScalerRec_* FTC_Scaler; + + + /************************************************************************** + * + * @function: + * FTC_Manager_LookupSize + * + * @description: + * Retrieve the @FT_Size object that corresponds to a given + * @FTC_ScalerRec pointer through a cache manager. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * scaler :: + * A scaler handle. + * + * @output: + * asize :: + * A handle to the size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned @FT_Size object is always owned by the manager. You + * should never try to discard it by yourself. + * + * You can access the parent @FT_Face object simply as `size->face` if + * you need it. Note that this object is also owned by the manager. + * + * @note: + * When you perform a lookup, out-of-memory errors are detected _within_ + * the lookup and force incremental flushes of the cache until enough + * memory is released for the lookup to succeed. + * + * If a lookup fails with `FT_Err_Out_Of_Memory` the cache has already + * been completely flushed, and still no memory is available for the + * operation. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ); + + + /************************************************************************** + * + * @function: + * FTC_Node_Unref + * + * @description: + * Decrement a cache node's internal reference count. When the count + * reaches 0, it is not destroyed but becomes eligible for subsequent + * cache flushes. + * + * @input: + * node :: + * The cache node handle. + * + * manager :: + * The cache manager handle. + */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_RemoveFaceID + * + * @description: + * A special function used to indicate to the cache manager that a given + * @FTC_FaceID is no longer valid, either because its content changed, or + * because it was deallocated or uninstalled. + * + * @input: + * manager :: + * The cache manager handle. + * + * face_id :: + * The @FTC_FaceID to be removed. + * + * @note: + * This function flushes all nodes from the cache corresponding to this + * `face_id`, with the exception of nodes with a non-null reference + * count. + * + * Such nodes are however modified internally so as to never appear in + * later lookups with the same `face_id` value, and to be immediately + * destroyed when released by all their users. + * + */ + FT_EXPORT( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ); + + + /************************************************************************** + * + * @type: + * FTC_CMapCache + * + * @description: + * An opaque handle used to model a charmap cache. This cache is to hold + * character codes -> glyph indices mappings. + * + */ + typedef struct FTC_CMapCacheRec_* FTC_CMapCache; + + + /************************************************************************** + * + * @function: + * FTC_CMapCache_New + * + * @description: + * Create a new charmap cache. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * @output: + * acache :: + * A new cache handle. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Like all other caches, this one will be destroyed with the cache + * manager. + * + */ + FT_EXPORT( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_CMapCache_Lookup + * + * @description: + * Translate a character code into a glyph index, using the charmap + * cache. + * + * @input: + * cache :: + * A charmap cache handle. + * + * face_id :: + * The source face ID. + * + * cmap_index :: + * The index of the charmap in the source face. Any negative value + * means to use the cache @FT_Face's default charmap. + * + * char_code :: + * The character code (in the corresponding charmap). + * + * @return: + * Glyph index. 0~means 'no glyph'. + * + */ + FT_EXPORT( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * FTC_ImageTypeRec + * + * @description: + * A structure used to model the type of images in a glyph cache. + * + * @fields: + * face_id :: + * The face ID. + * + * width :: + * The width in pixels. + * + * height :: + * The height in pixels. + * + * flags :: + * The load flags, as in @FT_Load_Glyph. + * + */ + typedef struct FTC_ImageTypeRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int32 flags; + + } FTC_ImageTypeRec; + + + /************************************************************************** + * + * @type: + * FTC_ImageType + * + * @description: + * A handle to an @FTC_ImageTypeRec structure. + * + */ + typedef struct FTC_ImageTypeRec_* FTC_ImageType; + + + /* */ + + +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( (d1)->face_id == (d2)->face_id && \ + (d1)->width == (d2)->width && \ + (d1)->flags == (d2)->flags ) + + + /************************************************************************** + * + * @type: + * FTC_ImageCache + * + * @description: + * A handle to a glyph image cache object. They are designed to hold + * many distinct glyph images while not exceeding a certain memory + * threshold. + */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_New + * + * @description: + * Create a new glyph image cache. + * + * @input: + * manager :: + * The parent manager for the image cache. + * + * @output: + * acache :: + * A handle to the new glyph image cache object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_Lookup + * + * @description: + * Retrieve a given glyph image from a glyph image cache. + * + * @input: + * cache :: + * A handle to the source glyph image cache. + * + * type :: + * A pointer to a glyph image type descriptor. + * + * gindex :: + * The glyph index to retrieve. + * + * @output: + * aglyph :: + * The corresponding @FT_Glyph object. 0~in case of failure. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned glyph is owned and managed by the glyph image cache. + * Never try to transform or discard it manually! You can however create + * a copy with @FT_Glyph_Copy and modify the new one. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the glyph image, after increasing its reference count. + * This ensures that the node (as well as the @FT_Glyph) will always be + * kept in the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the @FT_Glyph could be flushed out of the cache on the next call + * to one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_LookupScaler + * + * @description: + * A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec to + * specify the face ID and its size. + * + * @input: + * cache :: + * A handle to the source glyph image cache. + * + * scaler :: + * A pointer to a scaler descriptor. + * + * load_flags :: + * The corresponding load flags. + * + * gindex :: + * The glyph index to retrieve. + * + * @output: + * aglyph :: + * The corresponding @FT_Glyph object. 0~in case of failure. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned glyph is owned and managed by the glyph image cache. + * Never try to transform or discard it manually! You can however create + * a copy with @FT_Glyph_Copy and modify the new one. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the glyph image, after increasing its reference count. + * This ensures that the node (as well as the @FT_Glyph) will always be + * kept in the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the @FT_Glyph could be flushed out of the cache on the next call + * to one of the caching sub-system APIs. Don't assume that it is + * persistent! + * + * Calls to @FT_Set_Char_Size and friends have no effect on cached + * glyphs; you should always use the FreeType cache API instead. + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /************************************************************************** + * + * @type: + * FTC_SBit + * + * @description: + * A handle to a small bitmap descriptor. See the @FTC_SBitRec structure + * for details. + */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /************************************************************************** + * + * @struct: + * FTC_SBitRec + * + * @description: + * A very compact structure used to describe a small glyph bitmap. + * + * @fields: + * width :: + * The bitmap width in pixels. + * + * height :: + * The bitmap height in pixels. + * + * left :: + * The horizontal distance from the pen position to the left bitmap + * border (a.k.a. 'left side bearing', or 'lsb'). + * + * top :: + * The vertical distance from the pen position (on the baseline) to the + * upper bitmap border (a.k.a. 'top side bearing'). The distance is + * positive for upwards y~coordinates. + * + * format :: + * The format of the glyph bitmap (monochrome or gray). + * + * max_grays :: + * Maximum gray level value (in the range 1 to~255). + * + * pitch :: + * The number of bytes per bitmap line. May be positive or negative. + * + * xadvance :: + * The horizontal advance width in pixels. + * + * yadvance :: + * The vertical advance height in pixels. + * + * buffer :: + * A pointer to the bitmap pixels. + */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + /************************************************************************** + * + * @type: + * FTC_SBitCache + * + * @description: + * A handle to a small bitmap cache. These are special cache objects + * used to store small glyph bitmaps (and anti-aliased pixmaps) in a much + * more efficient way than the traditional glyph image cache implemented + * by @FTC_ImageCache. + */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_New + * + * @description: + * Create a new cache to store small glyph bitmaps. + * + * @input: + * manager :: + * A handle to the source cache manager. + * + * @output: + * acache :: + * A handle to the new sbit cache. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_Lookup + * + * @description: + * Look up a given small glyph bitmap in a given sbit cache and 'lock' it + * to prevent its flushing from the cache until needed. + * + * @input: + * cache :: + * A handle to the source sbit cache. + * + * type :: + * A pointer to the glyph image type descriptor. + * + * gindex :: + * The glyph index. + * + * @output: + * sbit :: + * A handle to a small bitmap descriptor. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The small bitmap descriptor and its bit buffer are owned by the cache + * and should never be freed by the application. They might as well + * disappear from memory on the next cache lookup, so don't treat them as + * persistent data. + * + * The descriptor's `buffer` field is set to~0 to indicate a missing + * glyph bitmap. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the bitmap, after increasing its reference count. This + * ensures that the node (as well as the image) will always be kept in + * the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the bitmap could be flushed out of the cache on the next call to + * one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_LookupScaler + * + * @description: + * A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec to + * specify the face ID and its size. + * + * @input: + * cache :: + * A handle to the source sbit cache. + * + * scaler :: + * A pointer to the scaler descriptor. + * + * load_flags :: + * The corresponding load flags. + * + * gindex :: + * The glyph index. + * + * @output: + * sbit :: + * A handle to a small bitmap descriptor. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The small bitmap descriptor and its bit buffer are owned by the cache + * and should never be freed by the application. They might as well + * disappear from memory on the next cache lookup, so don't treat them as + * persistent data. + * + * The descriptor's `buffer` field is set to~0 to indicate a missing + * glyph bitmap. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the bitmap, after increasing its reference count. This + * ensures that the node (as well as the image) will always be kept in + * the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the bitmap could be flushed out of the cache on the next call to + * one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCACHE_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftchapters.h b/NothinFancy/dep/include/freetype/ftchapters.h new file mode 100644 index 0000000..4f32cc8 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftchapters.h @@ -0,0 +1,147 @@ +/**************************************************************************** + * + * This file defines the structure of the FreeType reference. + * It is used by the python script that generates the HTML files. + * + */ + + + /************************************************************************** + * + * @chapter: + * general_remarks + * + * @title: + * General Remarks + * + * @sections: + * preamble + * header_inclusion + * user_allocation + * + */ + + + /************************************************************************** + * + * @chapter: + * core_api + * + * @title: + * Core API + * + * @sections: + * version + * basic_types + * base_interface + * glyph_variants + * color_management + * layer_management + * glyph_management + * mac_specific + * sizes_management + * header_file_macros + * + */ + + + /************************************************************************** + * + * @chapter: + * format_specific + * + * @title: + * Format-Specific API + * + * @sections: + * multiple_masters + * truetype_tables + * type1_tables + * sfnt_names + * bdf_fonts + * cid_fonts + * pfr_fonts + * winfnt_fonts + * font_formats + * gasp_table + * + */ + + + /************************************************************************** + * + * @chapter: + * module_specific + * + * @title: + * Controlling FreeType Modules + * + * @sections: + * auto_hinter + * cff_driver + * t1_cid_driver + * tt_driver + * pcf_driver + * properties + * parameter_tags + * lcd_rendering + * + */ + + + /************************************************************************** + * + * @chapter: + * cache_subsystem + * + * @title: + * Cache Sub-System + * + * @sections: + * cache_subsystem + * + */ + + + /************************************************************************** + * + * @chapter: + * support_api + * + * @title: + * Support API + * + * @sections: + * computations + * list_processing + * outline_processing + * quick_advance + * bitmap_handling + * raster + * glyph_stroker + * system_interface + * module_management + * gzip + * lzw + * bzip2 + * debugging_apis + * + */ + + + /************************************************************************** + * + * @chapter: + * error_codes + * + * @title: + * Error Codes + * + * @sections: + * error_enumerations + * error_code_values + * + */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftcid.h b/NothinFancy/dep/include/freetype/ftcid.h new file mode 100644 index 0000000..9a415bd --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftcid.h @@ -0,0 +1,167 @@ +/**************************************************************************** + * + * ftcid.h + * + * FreeType API for accessing CID font information (specification). + * + * Copyright (C) 2007-2021 by + * Dereg Clegg and Michael Toftdal. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCID_H_ +#define FTCID_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * cid_fonts + * + * @title: + * CID Fonts + * + * @abstract: + * CID-keyed font-specific API. + * + * @description: + * This section contains the declaration of CID-keyed font-specific + * functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_CID_Registry_Ordering_Supplement + * + * @description: + * Retrieve the Registry/Ordering/Supplement triple (also known as the + * "R/O/S") from a CID-keyed font. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * registry :: + * The registry, as a C~string, owned by the face. + * + * ordering :: + * The ordering, as a C~string, owned by the face. + * + * supplement :: + * The supplement. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces, returning an error + * otherwise. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ); + + + /************************************************************************** + * + * @function: + * FT_Get_CID_Is_Internally_CID_Keyed + * + * @description: + * Retrieve the type of the input face, CID keyed or not. In contrast + * to the @FT_IS_CID_KEYED macro this function returns successfully also + * for CID-keyed fonts in an SFNT wrapper. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * is_cid :: + * The type of the face as an @FT_Bool. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, returning + * an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ); + + + /************************************************************************** + * + * @function: + * FT_Get_CID_From_Glyph_Index + * + * @description: + * Retrieve the CID of the input glyph index. + * + * @input: + * face :: + * A handle to the input face. + * + * glyph_index :: + * The input glyph index. + * + * @output: + * cid :: + * The CID as an @FT_UInt. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, returning + * an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCID_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftcolor.h b/NothinFancy/dep/include/freetype/ftcolor.h new file mode 100644 index 0000000..59e6f15 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftcolor.h @@ -0,0 +1,1609 @@ +/**************************************************************************** + * + * ftcolor.h + * + * FreeType's glyph color management (specification). + * + * Copyright (C) 2018-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCOLOR_H_ +#define FTCOLOR_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * color_management + * + * @title: + * Glyph Color Management + * + * @abstract: + * Retrieving and manipulating OpenType's 'CPAL' table data. + * + * @description: + * The functions described here allow access and manipulation of color + * palette entries in OpenType's 'CPAL' tables. + */ + + + /************************************************************************** + * + * @struct: + * FT_Color + * + * @description: + * This structure models a BGRA color value of a 'CPAL' palette entry. + * + * The used color space is sRGB; the colors are not pre-multiplied, and + * alpha values must be explicitly set. + * + * @fields: + * blue :: + * Blue value. + * + * green :: + * Green value. + * + * red :: + * Red value. + * + * alpha :: + * Alpha value, giving the red, green, and blue color's opacity. + * + * @since: + * 2.10 + */ + typedef struct FT_Color_ + { + FT_Byte blue; + FT_Byte green; + FT_Byte red; + FT_Byte alpha; + + } FT_Color; + + + /************************************************************************** + * + * @enum: + * FT_PALETTE_XXX + * + * @description: + * A list of bit field constants used in the `palette_flags` array of the + * @FT_Palette_Data structure to indicate for which background a palette + * with a given index is usable. + * + * @values: + * FT_PALETTE_FOR_LIGHT_BACKGROUND :: + * The palette is appropriate to use when displaying the font on a + * light background such as white. + * + * FT_PALETTE_FOR_DARK_BACKGROUND :: + * The palette is appropriate to use when displaying the font on a dark + * background such as black. + * + * @since: + * 2.10 + */ +#define FT_PALETTE_FOR_LIGHT_BACKGROUND 0x01 +#define FT_PALETTE_FOR_DARK_BACKGROUND 0x02 + + + /************************************************************************** + * + * @struct: + * FT_Palette_Data + * + * @description: + * This structure holds the data of the 'CPAL' table. + * + * @fields: + * num_palettes :: + * The number of palettes. + * + * palette_name_ids :: + * An optional read-only array of palette name IDs with `num_palettes` + * elements, corresponding to entries like 'dark' or 'light' in the + * font's 'name' table. + * + * An empty name ID in the 'CPAL' table gets represented as value + * 0xFFFF. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * palette_flags :: + * An optional read-only array of palette flags with `num_palettes` + * elements. Possible values are an ORed combination of + * @FT_PALETTE_FOR_LIGHT_BACKGROUND and + * @FT_PALETTE_FOR_DARK_BACKGROUND. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * num_palette_entries :: + * The number of entries in a single palette. All palettes have the + * same size. + * + * palette_entry_name_ids :: + * An optional read-only array of palette entry name IDs with + * `num_palette_entries`. In each palette, entries with the same index + * have the same function. For example, index~0 might correspond to + * string 'outline' in the font's 'name' table to indicate that this + * palette entry is used for outlines, index~1 might correspond to + * 'fill' to indicate the filling color palette entry, etc. + * + * An empty entry name ID in the 'CPAL' table gets represented as value + * 0xFFFF. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * @note: + * Use function @FT_Get_Sfnt_Name to map name IDs and entry name IDs to + * name strings. + * + * Use function @FT_Palette_Select to get the colors associated with a + * palette entry. + * + * @since: + * 2.10 + */ + typedef struct FT_Palette_Data_ { + FT_UShort num_palettes; + const FT_UShort* palette_name_ids; + const FT_UShort* palette_flags; + + FT_UShort num_palette_entries; + const FT_UShort* palette_entry_name_ids; + + } FT_Palette_Data; + + + /************************************************************************** + * + * @function: + * FT_Palette_Data_Get + * + * @description: + * Retrieve the face's color palette data. + * + * @input: + * face :: + * The source face handle. + * + * @output: + * apalette :: + * A pointer to an @FT_Palette_Data structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * All arrays in the returned @FT_Palette_Data structure are read-only. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Data_Get( FT_Face face, + FT_Palette_Data *apalette ); + + + /************************************************************************** + * + * @function: + * FT_Palette_Select + * + * @description: + * This function has two purposes. + * + * (1) It activates a palette for rendering color glyphs, and + * + * (2) it retrieves all (unmodified) color entries of this palette. This + * function returns a read-write array, which means that a calling + * application can modify the palette entries on demand. + * + * A corollary of (2) is that calling the function, then modifying some + * values, then calling the function again with the same arguments resets + * all color entries to the original 'CPAL' values; all user modifications + * are lost. + * + * @input: + * face :: + * The source face handle. + * + * palette_index :: + * The palette index. + * + * @output: + * apalette :: + * An array of color entries for a palette with index `palette_index`, + * having `num_palette_entries` elements (as found in the + * `FT_Palette_Data` structure). If `apalette` is set to `NULL`, no + * array gets returned (and no color entries can be modified). + * + * In case the font doesn't support color palettes, `NULL` is returned. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The array pointed to by `apalette_entries` is owned and managed by + * FreeType. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Select( FT_Face face, + FT_UShort palette_index, + FT_Color* *apalette ); + + + /************************************************************************** + * + * @function: + * FT_Palette_Set_Foreground_Color + * + * @description: + * 'COLR' uses palette index 0xFFFF to indicate a 'text foreground + * color'. This function sets this value. + * + * @input: + * face :: + * The source face handle. + * + * foreground_color :: + * An `FT_Color` structure to define the text foreground color. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function isn't called, the text foreground color is set to + * white opaque (BGRA value 0xFFFFFFFF) if + * @FT_PALETTE_FOR_DARK_BACKGROUND is present for the current palette, + * and black opaque (BGRA value 0x000000FF) otherwise, including the case + * that no palette types are available in the 'CPAL' table. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Set_Foreground_Color( FT_Face face, + FT_Color foreground_color ); + + + /************************************************************************** + * + * @section: + * layer_management + * + * @title: + * Glyph Layer Management + * + * @abstract: + * Retrieving and manipulating OpenType's 'COLR' table data. + * + * @description: + * The functions described here allow access of colored glyph layer data + * in OpenType's 'COLR' tables. + */ + + + /************************************************************************** + * + * @struct: + * FT_LayerIterator + * + * @description: + * This iterator object is needed for @FT_Get_Color_Glyph_Layer. + * + * @fields: + * num_layers :: + * The number of glyph layers for the requested glyph index. Will be + * set by @FT_Get_Color_Glyph_Layer. + * + * layer :: + * The current layer. Will be set by @FT_Get_Color_Glyph_Layer. + * + * p :: + * An opaque pointer into 'COLR' table data. The caller must set this + * to `NULL` before the first call of @FT_Get_Color_Glyph_Layer. + */ + typedef struct FT_LayerIterator_ + { + FT_UInt num_layers; + FT_UInt layer; + FT_Byte* p; + + } FT_LayerIterator; + + + /************************************************************************** + * + * @function: + * FT_Get_Color_Glyph_Layer + * + * @description: + * This is an interface to the 'COLR' table in OpenType fonts to + * iteratively retrieve the colored glyph layers associated with the + * current glyph slot. + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/colr + * + * The glyph layer data for a given glyph index, if present, provides an + * alternative, multi-color glyph representation: Instead of rendering + * the outline or bitmap with the given glyph index, glyphs with the + * indices and colors returned by this function are rendered layer by + * layer. + * + * The returned elements are ordered in the z~direction from bottom to + * top; the 'n'th element should be rendered with the associated palette + * color and blended on top of the already rendered layers (elements 0, + * 1, ..., n-1). + * + * @input: + * face :: + * A handle to the parent face object. + * + * base_glyph :: + * The glyph index the colored glyph layers are associated with. + * + * @inout: + * iterator :: + * An @FT_LayerIterator object. For the first call you should set + * `iterator->p` to `NULL`. For all following calls, simply use the + * same object again. + * + * @output: + * aglyph_index :: + * The glyph index of the current layer. + * + * acolor_index :: + * The color index into the font face's color palette of the current + * layer. The value 0xFFFF is special; it doesn't reference a palette + * entry but indicates that the text foreground color should be used + * instead (to be set up by the application outside of FreeType). + * + * The color palette can be retrieved with @FT_Palette_Select. + * + * @return: + * Value~1 if everything is OK. If there are no more layers (or if there + * are no layers at all), value~0 gets returned. In case of an error, + * value~0 is returned also. + * + * @note: + * This function is necessary if you want to handle glyph layers by + * yourself. In particular, functions that operate with @FT_GlyphRec + * objects (like @FT_Get_Glyph or @FT_Glyph_To_Bitmap) don't have access + * to this information. + * + * Note that @FT_Render_Glyph is able to handle colored glyph layers + * automatically if the @FT_LOAD_COLOR flag is passed to a previous call + * to @FT_Load_Glyph. [This is an experimental feature.] + * + * @example: + * ``` + * FT_Color* palette; + * FT_LayerIterator iterator; + * + * FT_Bool have_layers; + * FT_UInt layer_glyph_index; + * FT_UInt layer_color_index; + * + * + * error = FT_Palette_Select( face, palette_index, &palette ); + * if ( error ) + * palette = NULL; + * + * iterator.p = NULL; + * have_layers = FT_Get_Color_Glyph_Layer( face, + * glyph_index, + * &layer_glyph_index, + * &layer_color_index, + * &iterator ); + * + * if ( palette && have_layers ) + * { + * do + * { + * FT_Color layer_color; + * + * + * if ( layer_color_index == 0xFFFF ) + * layer_color = text_foreground_color; + * else + * layer_color = palette[layer_color_index]; + * + * // Load and render glyph `layer_glyph_index', then + * // blend resulting pixmap (using color `layer_color') + * // with previously created pixmaps. + * + * } while ( FT_Get_Color_Glyph_Layer( face, + * glyph_index, + * &layer_glyph_index, + * &layer_color_index, + * &iterator ) ); + * } + * ``` + */ + FT_EXPORT( FT_Bool ) + FT_Get_Color_Glyph_Layer( FT_Face face, + FT_UInt base_glyph, + FT_UInt *aglyph_index, + FT_UInt *acolor_index, + FT_LayerIterator* iterator ); + + + /************************************************************************** + * + * @enum: + * FT_PaintFormat + * + * @description: + * Enumeration describing the different paint format types of the v1 + * extensions to the 'COLR' table, see + * 'https://github.com/googlefonts/colr-gradients-spec'. + * + * The enumeration values losely correspond with the format numbers of + * the specification: FreeType always returns a fully specified 'Paint' + * structure for the 'Transform', 'Translate', 'Scale', 'Rotate', and + * 'Skew' table types even though the specification has different formats + * depending on whether or not a center is specified, whether the scale + * is uniform in x and y~direction or not, etc. Also, only non-variable + * format identifiers are listed in this enumeration; as soon as support + * for variable 'COLR' v1 fonts is implemented, interpolation is + * performed dependent on axis coordinates, which are configured on the + * @FT_Face through @FT_Set_Var_Design_Coordinates. This implies that + * always static, readily interpolated values are returned in the 'Paint' + * structures. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef enum FT_PaintFormat_ + { + FT_COLR_PAINTFORMAT_COLR_LAYERS = 1, + FT_COLR_PAINTFORMAT_SOLID = 2, + FT_COLR_PAINTFORMAT_LINEAR_GRADIENT = 4, + FT_COLR_PAINTFORMAT_RADIAL_GRADIENT = 6, + FT_COLR_PAINTFORMAT_SWEEP_GRADIENT = 8, + FT_COLR_PAINTFORMAT_GLYPH = 10, + FT_COLR_PAINTFORMAT_COLR_GLYPH = 11, + FT_COLR_PAINTFORMAT_TRANSFORM = 12, + FT_COLR_PAINTFORMAT_TRANSLATE = 14, + FT_COLR_PAINTFORMAT_SCALE = 16, + FT_COLR_PAINTFORMAT_ROTATE = 24, + FT_COLR_PAINTFORMAT_SKEW = 28, + FT_COLR_PAINTFORMAT_COMPOSITE = 32, + FT_COLR_PAINT_FORMAT_MAX = 33, + FT_COLR_PAINTFORMAT_UNSUPPORTED = 255 + + } FT_PaintFormat; + + + /************************************************************************** + * + * @struct: + * FT_ColorStopIterator + * + * @description: + * This iterator object is needed for @FT_Get_Colorline_Stops. It keeps + * state while iterating over the stops of an @FT_ColorLine, + * representing the `ColorLine` struct of the v1 extensions to 'COLR', + * see 'https://github.com/googlefonts/colr-gradients-spec'. + * + * @fields: + * num_color_stops :: + * The number of color stops for the requested glyph index. Set by + * @FT_Get_Colorline_Stops. + * + * current_color_stop :: + * The current color stop. Set by @FT_Get_Colorline_Stops. + * + * p :: + * An opaque pointer into 'COLR' table data. The caller must set this + * to `NULL` before the first call of @FT_Get_Colorline_Stops. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_ColorStopIterator_ + { + FT_UInt num_color_stops; + FT_UInt current_color_stop; + + FT_Byte* p; + + } FT_ColorStopIterator; + + + /************************************************************************** + * + * @struct: + * FT_ColorIndex + * + * @description: + * A structure representing a `ColorIndex` value of the 'COLR' v1 + * extensions, see 'https://github.com/googlefonts/colr-gradients-spec'. + * + * @fields: + * palette_index :: + * The palette index into a 'CPAL' palette. + * + * alpha :: + * Alpha transparency value multiplied with the value from 'CPAL'. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_ColorIndex_ + { + FT_UInt16 palette_index; + FT_F2Dot14 alpha; + + } FT_ColorIndex; + + + /************************************************************************** + * + * @struct: + * FT_ColorStop + * + * @description: + * A structure representing a `ColorStop` value of the 'COLR' v1 + * extensions, see 'https://github.com/googlefonts/colr-gradients-spec'. + * + * @fields: + * stop_offset :: + * The stop offset between 0 and 1 along the gradient. + * + * color :: + * The color information for this stop, see @FT_ColorIndex. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_ColorStop_ + { + FT_F2Dot14 stop_offset; + FT_ColorIndex color; + + } FT_ColorStop; + + + /************************************************************************** + * + * @enum: + * FT_PaintExtend + * + * @description: + * An enumeration representing the 'Extend' mode of the 'COLR' v1 + * extensions, see 'https://github.com/googlefonts/colr-gradients-spec'. + * It describes how the gradient fill continues at the other boundaries. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef enum FT_PaintExtend_ + { + FT_COLR_PAINT_EXTEND_PAD = 0, + FT_COLR_PAINT_EXTEND_REPEAT = 1, + FT_COLR_PAINT_EXTEND_REFLECT = 2 + + } FT_PaintExtend; + + + /************************************************************************** + * + * @struct: + * FT_ColorLine + * + * @description: + * A structure representing a `ColorLine` value of the 'COLR' v1 + * extensions, see 'https://github.com/googlefonts/colr-gradients-spec'. + * It describes a list of color stops along the defined gradient. + * + * @fields: + * extend :: + * The extend mode at the outer boundaries, see @FT_PaintExtend. + * + * color_stop_iterator :: + * The @FT_ColorStopIterator used to enumerate and retrieve the + * actual @FT_ColorStop's. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_ColorLine_ + { + FT_PaintExtend extend; + FT_ColorStopIterator color_stop_iterator; + + } FT_ColorLine; + + + /************************************************************************** + * + * @struct: + * FT_Affine23 + * + * @description: + * A structure used to store a 2x3 matrix. Coefficients are in + * 16.16 fixed-point format. The computation performed is + * + * ``` + * x' = x*xx + y*xy + dx + * y' = x*yx + y*yy + dy + * ``` + * + * @fields: + * xx :: + * Matrix coefficient. + * + * xy :: + * Matrix coefficient. + * + * dx :: + * x translation. + * + * yx :: + * Matrix coefficient. + * + * yy :: + * Matrix coefficient. + * + * dy :: + * y translation. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_Affine_23_ + { + FT_Fixed xx, xy, dx; + FT_Fixed yx, yy, dy; + + } FT_Affine23; + + + /************************************************************************** + * + * @enum: + * FT_Composite_Mode + * + * @description: + * An enumeration listing the 'COLR' v1 composite modes used in + * @FT_PaintComposite. For more details on each paint mode, see + * 'https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators'. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef enum FT_Composite_Mode_ + { + FT_COLR_COMPOSITE_CLEAR = 0, + FT_COLR_COMPOSITE_SRC = 1, + FT_COLR_COMPOSITE_DEST = 2, + FT_COLR_COMPOSITE_SRC_OVER = 3, + FT_COLR_COMPOSITE_DEST_OVER = 4, + FT_COLR_COMPOSITE_SRC_IN = 5, + FT_COLR_COMPOSITE_DEST_IN = 6, + FT_COLR_COMPOSITE_SRC_OUT = 7, + FT_COLR_COMPOSITE_DEST_OUT = 8, + FT_COLR_COMPOSITE_SRC_ATOP = 9, + FT_COLR_COMPOSITE_DEST_ATOP = 10, + FT_COLR_COMPOSITE_XOR = 11, + FT_COLR_COMPOSITE_SCREEN = 12, + FT_COLR_COMPOSITE_OVERLAY = 13, + FT_COLR_COMPOSITE_DARKEN = 14, + FT_COLR_COMPOSITE_LIGHTEN = 15, + FT_COLR_COMPOSITE_COLOR_DODGE = 16, + FT_COLR_COMPOSITE_COLOR_BURN = 17, + FT_COLR_COMPOSITE_HARD_LIGHT = 18, + FT_COLR_COMPOSITE_SOFT_LIGHT = 19, + FT_COLR_COMPOSITE_DIFFERENCE = 20, + FT_COLR_COMPOSITE_EXCLUSION = 21, + FT_COLR_COMPOSITE_MULTIPLY = 22, + FT_COLR_COMPOSITE_HSL_HUE = 23, + FT_COLR_COMPOSITE_HSL_SATURATION = 24, + FT_COLR_COMPOSITE_HSL_COLOR = 25, + FT_COLR_COMPOSITE_HSL_LUMINOSITY = 26, + FT_COLR_COMPOSITE_MAX = 27 + + } FT_Composite_Mode; + + + /************************************************************************** + * + * @struct: + * FT_OpaquePaint + * + * @description: + * A structure representing an offset to a `Paint` value stored in any + * of the paint tables of a 'COLR' v1 font. Compare Offset<24> there. + * When 'COLR' v1 paint tables represented by FreeType objects such as + * @FT_PaintColrLayers, @FT_PaintComposite, or @FT_PaintTransform + * reference downstream nested paint tables, we do not immediately + * retrieve them but encapsulate their location in this type. Use + * @FT_Get_Paint to retrieve the actual @FT_COLR_Paint object that + * describes the details of the respective paint table. + * + * @fields: + * p :: + * An internal offset to a Paint table, needs to be set to NULL before + * passing this struct as an argument to @FT_Get_Paint. + * + * insert_root_transform :: + * An internal boolean to track whether an initial root transform is + * to be provided. Do not set this value. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_Opaque_Paint_ + { + FT_Byte* p; + FT_Bool insert_root_transform; + } FT_OpaquePaint; + + + /************************************************************************** + * + * @struct: + * FT_PaintColrLayers + * + * @description: + * A structure representing a `PaintColrLayers` table of a 'COLR' v1 + * font. This table describes a set of layers that are to be composited + * with composite mode `FT_COLR_COMPOSITE_SRC_OVER`. The return value + * of this function is an @FT_LayerIterator initialized so that it can + * be used with @FT_Get_Paint_Layers to retrieve the @FT_OpaquePaint + * objects as references to each layer. + * + * @fields: + * layer_iterator :: + * The layer iterator that describes the layers of this paint. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintColrLayers_ + { + FT_LayerIterator layer_iterator; + + } FT_PaintColrLayers; + + + /************************************************************************** + * + * @struct: + * FT_PaintSolid + * + * @description: + * A structure representing a `PaintSolid` value of the 'COLR' v1 + * extensions, see 'https://github.com/googlefonts/colr-gradients-spec'. + * Using a `PaintSolid` value means that the glyph layer filled with + * this paint is solid-colored and does not contain a gradient. + * + * @fields: + * color :: + * The color information for this solid paint, see @FT_ColorIndex. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintSolid_ + { + FT_ColorIndex color; + + } FT_PaintSolid; + + + /************************************************************************** + * + * @struct: + * FT_PaintLinearGradient + * + * @description: + * A structure representing a `PaintLinearGradient` value of the 'COLR' + * v1 extensions, see + * 'https://github.com/googlefonts/colr-gradients-spec'. The glyph + * layer filled with this paint is drawn filled with a linear gradient. + * + * @fields: + * colorline :: + * The @FT_ColorLine information for this paint, i.e., the list of + * color stops along the gradient. + * + * p0 :: + * The starting point of the gradient definition (in font units). + * + * p1 :: + * The end point of the gradient definition (in font units). + * + * p2 :: + * Optional point~p2 to rotate the gradient (in font units). + * Otherwise equal to~p0. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintLinearGradient_ + { + FT_ColorLine colorline; + + /* TODO: Potentially expose those as x0, y0 etc. */ + FT_Vector p0; + FT_Vector p1; + FT_Vector p2; + + } FT_PaintLinearGradient; + + + /************************************************************************** + * + * @struct: + * FT_PaintRadialGradient + * + * @description: + * A structure representing a `PaintRadialGradient` value of the 'COLR' + * v1 extensions, see + * 'https://github.com/googlefonts/colr-gradients-spec'. The glyph + * layer filled with this paint is drawn filled filled with a radial + * gradient. + * + * @fields: + * colorline :: + * The @FT_ColorLine information for this paint, i.e., the list of + * color stops along the gradient. + * + * c0 :: + * The center of the starting point of the radial gradient (in font + * units). + * + * r0 :: + * The radius of the starting circle of the radial gradient (in font + * units). + * + * c1 :: + * The center of the end point of the radial gradient (in font units). + * + * r1 :: + * The radius of the end circle of the radial gradient (in font + * units). + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintRadialGradient_ + { + FT_ColorLine colorline; + + FT_Vector c0; + FT_UShort r0; + FT_Vector c1; + FT_UShort r1; + + } FT_PaintRadialGradient; + + + /************************************************************************** + * + * @struct: + * FT_PaintSweepGradient + * + * @description: + * A structure representing a `PaintSweepGradient` value of the 'COLR' + * v1 extensions, see + * 'https://github.com/googlefonts/colr-gradients-spec'. The glyph + * layer filled with this paint is drawn filled with a sweep gradient + * from `start_angle` to `end_angle`. + * + * @fields: + * colorline :: + * The @FT_ColorLine information for this paint, i.e., the list of + * color stops along the gradient. + * + * center :: + * The center of the sweep gradient (in font units). + * + * start_angle :: + * The start angle of the sweep gradient, in 16.16 fixed point format + * specifying degrees. Values are given counter-clockwise, starting + * from the (positive) y~axis. + * + * end_angle :: + * The end angle of the sweep gradient, in 16.16 fixed point format + * specifying degrees. Values are given counter-clockwise, starting + * from the (positive) y~axis. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintSweepGradient_ + { + FT_ColorLine colorline; + + FT_Vector center; + FT_Fixed start_angle; + FT_Fixed end_angle; + + } FT_PaintSweepGradient; + + + /************************************************************************** + * + * @struct: + * FT_PaintGlyph + * + * @description: + * A structure representing a 'COLR' v1 `PaintGlyph` paint table. + * + * @fields: + * paint :: + * An opaque paint object pointing to a `Paint` table that serves as + * the fill for the glyph ID. + * + * glyphID :: + * The glyph ID from the 'glyf' table, which serves as the contour + * information that is filled with paint. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintGlyph_ + { + FT_OpaquePaint paint; + FT_UInt glyphID; + + } FT_PaintGlyph; + + + /************************************************************************** + * + * @struct: + * FT_PaintColrGlyph + * + * @description: + * A structure representing a 'COLR' v1 `PaintColorGlyph` paint table. + * + * @fields: + * glyphID :: + * The glyph ID from the `BaseGlyphV1List` table that is drawn for + * this paint. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintColrGlyph_ + { + FT_UInt glyphID; + + } FT_PaintColrGlyph; + + + /************************************************************************** + * + * @struct: + * FT_PaintTransform + * + * @description: + * A structure representing a 'COLR' v1 `PaintTransform` paint table. + * + * @fields: + * paint :: + * An opaque paint that is subject to being transformed. + * + * affine :: + * A 2x3 transformation matrix in @FT_Affine23 format. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintTransform_ + { + FT_OpaquePaint paint; + FT_Affine23 affine; + + } FT_PaintTransform; + + + /************************************************************************** + * + * @struct: + * FT_PaintTranslate + * + * @description: + * A structure representing a 'COLR' v1 `PaintTranslate` paint table. + * Used for translating downstream paints by a given x and y~delta. + * + * @fields: + * paint :: + * An @FT_OpaquePaint object referencing the paint that is to be + * rotated. + * + * dx :: + * Translation in x~direction (in font units). + * + * dy :: + * Translation in y~direction (in font units). + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintTranslate_ + { + FT_OpaquePaint paint; + + FT_Fixed dx; + FT_Fixed dy; + + } FT_PaintTranslate; + + + /************************************************************************** + * + * @struct: + * FT_PaintScale + * + * @description: + * A structure representing all of the 'COLR' v1 'PaintScale*' paint + * tables. Used for scaling downstream paints by a given x and y~scale, + * with a given center. This structure is used for all 'PaintScale*' + * types that are part of specification; fields of this structure are + * filled accordingly. If there is a center, the center values are set, + * otherwise they are set to the zero coordinate. If the source font + * file has 'PaintScaleUniform*' set, the scale values are set + * accordingly to the same value. + * + * @fields: + * paint :: + * An @FT_OpaquePaint object referencing the paint that is to be + * scaled. + * + * scale_x :: + * Scale factor in x~direction. + * + * scale_y :: + * Scale factor in y~direction. + * + * center_x :: + * x~coordinate of center point to scale from. + * + * center_y :: + * y~coordinate of center point to scale from. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward-compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintScale_ + { + FT_OpaquePaint paint; + + FT_Fixed scale_x; + FT_Fixed scale_y; + + FT_Fixed center_x; + FT_Fixed center_y; + + } FT_PaintScale; + + + /************************************************************************** + * + * @struct: + * FT_PaintRotate + * + * @description: + * A structure representing a 'COLR' v1 `PaintRotate` paint table. Used + * for rotating downstream paints with a given center and angle. + * + * @fields: + * paint :: + * An @FT_OpaquePaint object referencing the paint that is to be + * rotated. + * + * angle :: + * The rotation angle that is to be applied. + * + * center_x :: + * The x~coordinate of the pivot point of the rotation (in font + * units). + * + * center_y :: + * The y~coordinate of the pivot point of the rotation (in font + * units). + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + + typedef struct FT_PaintRotate_ + { + FT_OpaquePaint paint; + + FT_Fixed angle; + + FT_Fixed center_x; + FT_Fixed center_y; + + } FT_PaintRotate; + + + /************************************************************************** + * + * @struct: + * FT_PaintSkew + * + * @description: + * A structure representing a 'COLR' v1 `PaintSkew` paint table. Used + * for skewing or shearing downstream paints by a given center and + * angle. + * + * @fields: + * paint :: + * An @FT_OpaquePaint object referencing the paint that is to be + * skewed. + * + * x_skew_angle :: + * The skewing angle in x~direction. + * + * y_skew_angle :: + * The skewing angle in y~direction. + * + * center_x :: + * The x~coordinate of the pivot point of the skew (in font units). + * + * center_y :: + * The y~coordinate of the pivot point of the skew (in font units). + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintSkew_ + { + FT_OpaquePaint paint; + + FT_Fixed x_skew_angle; + FT_Fixed y_skew_angle; + + FT_Fixed center_x; + FT_Fixed center_y; + + } FT_PaintSkew; + + + /************************************************************************** + * + * @struct: + * FT_PaintComposite + * + * @description: + * A structure representing a 'COLR'v1 `PaintComposite` paint table. + * Used for compositing two paints in a 'COLR' v1 directed acycling + * graph. + * + * @fields: + * source_paint :: + * An @FT_OpaquePaint object referencing the source that is to be + * composited. + * + * composite_mode :: + * An @FT_Composite_Mode enum value determining the composition + * operation. + * + * backdrop_paint :: + * An @FT_OpaquePaint object referencing the backdrop paint that + * `source_paint` is composited onto. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_PaintComposite_ + { + FT_OpaquePaint source_paint; + FT_Composite_Mode composite_mode; + FT_OpaquePaint backdrop_paint; + + } FT_PaintComposite; + + + /************************************************************************** + * + * @union: + * FT_COLR_Paint + * + * @description: + * A union object representing format and details of a paint table of a + * 'COLR' v1 font, see + * 'https://github.com/googlefonts/colr-gradients-spec'. Use + * @FT_Get_Paint to retrieve a @FT_COLR_Paint for an @FT_OpaquePaint + * object. + * + * @fields: + * format :: + * The gradient format for this Paint structure. + * + * u :: + * Union of all paint table types: + * + * * @FT_PaintColrLayers + * * @FT_PaintGlyph + * * @FT_PaintSolid + * * @FT_PaintLinearGradient + * * @FT_PaintRadialGradient + * * @FT_PaintSweepGradient + * * @FT_PaintTransform + * * @FT_PaintTranslate + * * @FT_PaintRotate + * * @FT_PaintSkew + * * @FT_PaintComposite + * * @FT_PaintColrGlyph + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef struct FT_COLR_Paint_ + { + FT_PaintFormat format; + + union + { + FT_PaintColrLayers colr_layers; + FT_PaintGlyph glyph; + FT_PaintSolid solid; + FT_PaintLinearGradient linear_gradient; + FT_PaintRadialGradient radial_gradient; + FT_PaintSweepGradient sweep_gradient; + FT_PaintTransform transform; + FT_PaintTranslate translate; + FT_PaintScale scale; + FT_PaintRotate rotate; + FT_PaintSkew skew; + FT_PaintComposite composite; + FT_PaintColrGlyph colr_glyph; + + } u; + + } FT_COLR_Paint; + + + /************************************************************************** + * + * @enum: + * FT_Color_Root_Transform + * + * @description: + * An enumeration to specify whether @FT_Get_Color_Glyph_Paint is to + * return a root transform to configure the client's graphics context + * matrix. + * + * @values: + * FT_COLOR_INCLUDE_ROOT_TRANSFORM :: + * Do include the root transform as the initial @FT_COLR_Paint object. + * + * FT_COLOR_NO_ROOT_TRANSFORM :: + * Do not output an initial root transform. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + typedef enum FT_Color_Root_Transform_ + { + FT_COLOR_INCLUDE_ROOT_TRANSFORM, + FT_COLOR_NO_ROOT_TRANSFORM, + + FT_COLOR_ROOT_TRANSFORM_MAX + + } FT_Color_Root_Transform; + + + /************************************************************************** + * + * @function: + * FT_Get_Color_Glyph_Paint + * + * @description: + * This is the starting point and interface to color gradient + * information in a 'COLR' v1 table in OpenType fonts to recursively + * retrieve the paint tables for the directed acyclic graph of a colored + * glyph, given a glyph ID. + * + * https://github.com/googlefonts/colr-gradients-spec + * + * In a 'COLR' v1 font, each color glyph defines a directed acyclic + * graph of nested paint tables, such as `PaintGlyph`, `PaintSolid`, + * `PaintLinearGradient`, `PaintRadialGradient`, and so on. Using this + * function and specifying a glyph ID, one retrieves the root paint + * table for this glyph ID. + * + * This function allows control whether an initial root transform is + * returned to configure scaling, transform, and translation correctly + * on the client's graphics context. The initial root transform is + * computed and returned according to the values configured for @FT_Size + * and @FT_Set_Transform on the @FT_Face object, see below for details + * of the `root_transform` parameter. This has implications for a + * client 'COLR' v1 implementation: When this function returns an + * initially computed root transform, at the time of executing the + * @FT_PaintGlyph operation, the contours should be retrieved using + * @FT_Load_Glyph at unscaled, untransformed size. This is because the + * root transform applied to the graphics context will take care of + * correct scaling. + * + * Alternatively, to allow hinting of contours, at the time of executing + * @FT_Load_Glyph, the current graphics context transformation matrix + * can be decomposed into a scaling matrix and a remainder, and + * @FT_Load_Glyph can be used to retrieve the contours at scaled size. + * Care must then be taken to blit or clip to the graphics context with + * taking this remainder transformation into account. + * + * @input: + * face :: + * A handle to the parent face object. + * + * base_glyph :: + * The glyph index for which to retrieve the root paint table. + * + * root_transform :: + * Specifies whether an initially computed root is returned by the + * @FT_PaintTransform operation to account for the activated size + * (see @FT_Activate_Size) and the configured transform and translate + * (see @FT_Set_Transform). + * + * This root transform is returned before nodes of the glyph graph of + * the font are returned. Subsequent @FT_COLR_Paint structures + * contain unscaled and untransformed values. The inserted root + * transform enables the client application to apply an initial + * transform to its graphics context. When executing subsequent + * FT_COLR_Paint operations, values from @FT_COLR_Paint operations + * will ultimately be correctly scaled because of the root transform + * applied to the graphics context. Use + * @FT_COLOR_INCLUDE_ROOT_TRANSFORM to include the root transform, use + * @FT_COLOR_NO_ROOT_TRANSFORM to not include it. The latter may be + * useful when traversing the 'COLR' v1 glyph graph and reaching a + * @FT_PaintColrGlyph. When recursing into @FT_PaintColrGlyph and + * painting that inline, no additional root transform is needed as it + * has already been applied to the graphics context at the beginning + * of drawing this glyph. + * + * @output: + * paint :: + * The @FT_OpaquePaint object that references the actual paint table. + * + * The respective actual @FT_COLR_Paint object is retrieved via + * @FT_Get_Paint. + * + * @return: + * Value~1 if everything is OK. If no color glyph is found, or the root + * paint could not be retrieved, value~0 gets returned. In case of an + * error, value~0 is returned also. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + FT_EXPORT( FT_Bool ) + FT_Get_Color_Glyph_Paint( FT_Face face, + FT_UInt base_glyph, + FT_Color_Root_Transform root_transform, + FT_OpaquePaint* paint ); + + + /************************************************************************** + * + * @function: + * FT_Get_Paint_Layers + * + * @description: + * Access the layers of a `PaintColrLayers` table. + * + * If the root paint of a color glyph, or a nested paint of a 'COLR' + * glyph is a `PaintColrLayers` table, this function retrieves the + * layers of the `PaintColrLayers` table. + * + * The @FT_PaintColrLayers object contains an @FT_LayerIterator, which + * is used here to iterate over the layers. Each layer is returned as + * an @FT_OpaquePaint object, which then can be used with @FT_Get_Paint + * to retrieve the actual paint object. + * + * @input: + * face :: + * A handle to the parent face object. + * + * @inout: + * iterator :: + * The @FT_LayerIterator from an @FT_PaintColrLayers object, for which + * the layers are to be retrieved. The internal state of the iterator + * is incremented after one call to this function for retrieving one + * layer. + * + * @output: + * paint :: + * The @FT_OpaquePaint object that references the actual paint table. + * The respective actual @FT_COLR_Paint object is retrieved via + * @FT_Get_Paint. + * + * @return: + * Value~1 if everything is OK. Value~0 gets returned when the paint + * object can not be retrieved or any other error occurs. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + FT_EXPORT( FT_Bool ) + FT_Get_Paint_Layers( FT_Face face, + FT_LayerIterator* iterator, + FT_OpaquePaint* paint ); + + + /************************************************************************** + * + * @function: + * FT_Get_Colorline_Stops + * + * @description: + * This is an interface to color gradient information in a 'COLR' v1 + * table in OpenType fonts to iteratively retrieve the gradient and + * solid fill information for colored glyph layers for a specified glyph + * ID. + * + * https://github.com/googlefonts/colr-gradients-spec + * + * @input: + * face :: + * A handle to the parent face object. + * + * @inout: + * iterator :: + * The retrieved @FT_ColorStopIterator, configured on an @FT_ColorLine, + * which in turn got retrieved via paint information in + * @FT_PaintLinearGradient or @FT_PaintRadialGradient. + * + * @output: + * color_stop :: + * Color index and alpha value for the retrieved color stop. + * + * @return: + * Value~1 if everything is OK. If there are no more color stops, + * value~0 gets returned. In case of an error, value~0 is returned + * also. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + FT_EXPORT( FT_Bool ) + FT_Get_Colorline_Stops( FT_Face face, + FT_ColorStop* color_stop, + FT_ColorStopIterator* iterator ); + + + /************************************************************************** + * + * @function: + * FT_Get_Paint + * + * @description: + * Access the details of a paint using an @FT_OpaquePaint opaque paint + * object, which internally stores the offset to the respective `Paint` + * object in the 'COLR' table. + * + * @input: + * face :: + * A handle to the parent face object. + * + * opaque_paint :: + * The opaque paint object for which the underlying @FT_COLR_Paint + * data is to be retrieved. + * + * @output: + * paint :: + * The specific @FT_COLR_Paint object containing information coming + * from one of the font's `Paint*` tables. + * + * @return: + * Value~1 if everything is OK. Value~0 if no details can be found for + * this paint or any other error occured. + * + * @since: + * 2.11 -- **currently experimental only!** There might be changes + * without retaining backward compatibility of both the API and ABI. + * + */ + FT_EXPORT( FT_Bool ) + FT_Get_Paint( FT_Face face, + FT_OpaquePaint opaque_paint, + FT_COLR_Paint* paint ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCOLOR_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftdriver.h b/NothinFancy/dep/include/freetype/ftdriver.h new file mode 100644 index 0000000..4936639 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftdriver.h @@ -0,0 +1,1193 @@ +/**************************************************************************** + * + * ftdriver.h + * + * FreeType API for controlling driver modules (specification only). + * + * Copyright (C) 2017-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTDRIVER_H_ +#define FTDRIVER_H_ + +#include +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * auto_hinter + * + * @title: + * The auto-hinter + * + * @abstract: + * Controlling the auto-hinting module. + * + * @description: + * While FreeType's auto-hinter doesn't expose API functions by itself, + * it is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. The following lists the available properties + * together with the necessary macros and structures. + * + * Note that the auto-hinter's module name is 'autofitter' for historical + * reasons. + * + * Available properties are @increase-x-height, @no-stem-darkening + * (experimental), @darkening-parameters (experimental), + * @glyph-to-script-map (experimental), @fallback-script (experimental), + * and @default-script (experimental), as documented in the @properties + * section. + * + */ + + + /************************************************************************** + * + * @section: + * cff_driver + * + * @title: + * The CFF driver + * + * @abstract: + * Controlling the CFF driver module. + * + * @description: + * While FreeType's CFF driver doesn't expose API functions by itself, it + * is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. + * + * The CFF driver's module name is 'cff'. + * + * Available properties are @hinting-engine, @no-stem-darkening, + * @darkening-parameters, and @random-seed, as documented in the + * @properties section. + * + * + * **Hinting and anti-aliasing principles of the new engine** + * + * The rasterizer is positioning horizontal features (e.g., ascender + * height & x-height, or crossbars) on the pixel grid and minimizing the + * amount of anti-aliasing applied to them, while placing vertical + * features (vertical stems) on the pixel grid without hinting, thus + * representing the stem position and weight accurately. Sometimes the + * vertical stems may be only partially black. In this context, + * 'anti-aliasing' means that stems are not positioned exactly on pixel + * borders, causing a fuzzy appearance. + * + * There are two principles behind this approach. + * + * 1) No hinting in the horizontal direction: Unlike 'superhinted' + * TrueType, which changes glyph widths to accommodate regular + * inter-glyph spacing, Adobe's approach is 'faithful to the design' in + * representing both the glyph width and the inter-glyph spacing designed + * for the font. This makes the screen display as close as it can be to + * the result one would get with infinite resolution, while preserving + * what is considered the key characteristics of each glyph. Note that + * the distances between unhinted and grid-fitted positions at small + * sizes are comparable to kerning values and thus would be noticeable + * (and distracting) while reading if hinting were applied. + * + * One of the reasons to not hint horizontally is anti-aliasing for LCD + * screens: The pixel geometry of modern displays supplies three vertical + * subpixels as the eye moves horizontally across each visible pixel. On + * devices where we can be certain this characteristic is present a + * rasterizer can take advantage of the subpixels to add increments of + * weight. In Western writing systems this turns out to be the more + * critical direction anyway; the weights and spacing of vertical stems + * (see above) are central to Armenian, Cyrillic, Greek, and Latin type + * designs. Even when the rasterizer uses greyscale anti-aliasing instead + * of color (a necessary compromise when one doesn't know the screen + * characteristics), the unhinted vertical features preserve the design's + * weight and spacing much better than aliased type would. + * + * 2) Alignment in the vertical direction: Weights and spacing along the + * y~axis are less critical; what is much more important is the visual + * alignment of related features (like cap-height and x-height). The + * sense of alignment for these is enhanced by the sharpness of grid-fit + * edges, while the cruder vertical resolution (full pixels instead of + * 1/3 pixels) is less of a problem. + * + * On the technical side, horizontal alignment zones for ascender, + * x-height, and other important height values (traditionally called + * 'blue zones') as defined in the font are positioned independently, + * each being rounded to the nearest pixel edge, taking care of overshoot + * suppression at small sizes, stem darkening, and scaling. + * + * Hstems (this is, hint values defined in the font to help align + * horizontal features) that fall within a blue zone are said to be + * 'captured' and are aligned to that zone. Uncaptured stems are moved + * in one of four ways, top edge up or down, bottom edge up or down. + * Unless there are conflicting hstems, the smallest movement is taken to + * minimize distortion. + * + */ + + + /************************************************************************** + * + * @section: + * pcf_driver + * + * @title: + * The PCF driver + * + * @abstract: + * Controlling the PCF driver module. + * + * @description: + * While FreeType's PCF driver doesn't expose API functions by itself, it + * is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. Right now, there is a single property + * @no-long-family-names available if FreeType is compiled with + * PCF_CONFIG_OPTION_LONG_FAMILY_NAMES. + * + * The PCF driver's module name is 'pcf'. + * + */ + + + /************************************************************************** + * + * @section: + * t1_cid_driver + * + * @title: + * The Type 1 and CID drivers + * + * @abstract: + * Controlling the Type~1 and CID driver modules. + * + * @description: + * It is possible to control the behaviour of FreeType's Type~1 and + * Type~1 CID drivers with @FT_Property_Set and @FT_Property_Get. + * + * Behind the scenes, both drivers use the Adobe CFF engine for hinting; + * however, the used properties must be specified separately. + * + * The Type~1 driver's module name is 'type1'; the CID driver's module + * name is 't1cid'. + * + * Available properties are @hinting-engine, @no-stem-darkening, + * @darkening-parameters, and @random-seed, as documented in the + * @properties section. + * + * Please see the @cff_driver section for more details on the new hinting + * engine. + * + */ + + + /************************************************************************** + * + * @section: + * tt_driver + * + * @title: + * The TrueType driver + * + * @abstract: + * Controlling the TrueType driver module. + * + * @description: + * While FreeType's TrueType driver doesn't expose API functions by + * itself, it is possible to control its behaviour with @FT_Property_Set + * and @FT_Property_Get. The following lists the available properties + * together with the necessary macros and structures. + * + * The TrueType driver's module name is 'truetype'. + * + * A single property @interpreter-version is available, as documented in + * the @properties section. + * + * We start with a list of definitions, kindly provided by Greg + * Hitchcock. + * + * _Bi-Level Rendering_ + * + * Monochromatic rendering, exclusively used in the early days of + * TrueType by both Apple and Microsoft. Microsoft's GDI interface + * supported hinting of the right-side bearing point, such that the + * advance width could be non-linear. Most often this was done to + * achieve some level of glyph symmetry. To enable reasonable + * performance (e.g., not having to run hinting on all glyphs just to get + * the widths) there was a bit in the head table indicating if the side + * bearing was hinted, and additional tables, 'hdmx' and 'LTSH', to cache + * hinting widths across multiple sizes and device aspect ratios. + * + * _Font Smoothing_ + * + * Microsoft's GDI implementation of anti-aliasing. Not traditional + * anti-aliasing as the outlines were hinted before the sampling. The + * widths matched the bi-level rendering. + * + * _ClearType Rendering_ + * + * Technique that uses physical subpixels to improve rendering on LCD + * (and other) displays. Because of the higher resolution, many methods + * of improving symmetry in glyphs through hinting the right-side bearing + * were no longer necessary. This lead to what GDI calls 'natural + * widths' ClearType, see + * http://rastertragedy.com/RTRCh4.htm#Sec21. Since hinting + * has extra resolution, most non-linearity went away, but it is still + * possible for hints to change the advance widths in this mode. + * + * _ClearType Compatible Widths_ + * + * One of the earliest challenges with ClearType was allowing the + * implementation in GDI to be selected without requiring all UI and + * documents to reflow. To address this, a compatible method of + * rendering ClearType was added where the font hints are executed once + * to determine the width in bi-level rendering, and then re-run in + * ClearType, with the difference in widths being absorbed in the font + * hints for ClearType (mostly in the white space of hints); see + * http://rastertragedy.com/RTRCh4.htm#Sec20. Somewhat by + * definition, compatible width ClearType allows for non-linear widths, + * but only when the bi-level version has non-linear widths. + * + * _ClearType Subpixel Positioning_ + * + * One of the nice benefits of ClearType is the ability to more crisply + * display fractional widths; unfortunately, the GDI model of integer + * bitmaps did not support this. However, the WPF and Direct Write + * frameworks do support fractional widths. DWrite calls this 'natural + * mode', not to be confused with GDI's 'natural widths'. Subpixel + * positioning, in the current implementation of Direct Write, + * unfortunately does not support hinted advance widths, see + * http://rastertragedy.com/RTRCh4.htm#Sec22. Note that the + * TrueType interpreter fully allows the advance width to be adjusted in + * this mode, just the DWrite client will ignore those changes. + * + * _ClearType Backward Compatibility_ + * + * This is a set of exceptions made in the TrueType interpreter to + * minimize hinting techniques that were problematic with the extra + * resolution of ClearType; see + * http://rastertragedy.com/RTRCh4.htm#Sec1 and + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx. + * This technique is not to be confused with ClearType compatible widths. + * ClearType backward compatibility has no direct impact on changing + * advance widths, but there might be an indirect impact on disabling + * some deltas. This could be worked around in backward compatibility + * mode. + * + * _Native ClearType Mode_ + * + * (Not to be confused with 'natural widths'.) This mode removes all the + * exceptions in the TrueType interpreter when running with ClearType. + * Any issues on widths would still apply, though. + * + */ + + + /************************************************************************** + * + * @section: + * properties + * + * @title: + * Driver properties + * + * @abstract: + * Controlling driver modules. + * + * @description: + * Driver modules can be controlled by setting and unsetting properties, + * using the functions @FT_Property_Set and @FT_Property_Get. This + * section documents the available properties, together with auxiliary + * macros and structures. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_HINTING_XXX + * + * @description: + * A list of constants used for the @hinting-engine property to select + * the hinting engine for CFF, Type~1, and CID fonts. + * + * @values: + * FT_HINTING_FREETYPE :: + * Use the old FreeType hinting engine. + * + * FT_HINTING_ADOBE :: + * Use the hinting engine contributed by Adobe. + * + * @since: + * 2.9 + * + */ +#define FT_HINTING_FREETYPE 0 +#define FT_HINTING_ADOBE 1 + + /* these constants (introduced in 2.4.12) are deprecated */ +#define FT_CFF_HINTING_FREETYPE FT_HINTING_FREETYPE +#define FT_CFF_HINTING_ADOBE FT_HINTING_ADOBE + + + /************************************************************************** + * + * @property: + * hinting-engine + * + * @description: + * Thanks to Adobe, which contributed a new hinting (and parsing) engine, + * an application can select between 'freetype' and 'adobe' if compiled + * with `CFF_CONFIG_OPTION_OLD_ENGINE`. If this configuration macro + * isn't defined, 'hinting-engine' does nothing. + * + * The same holds for the Type~1 and CID modules if compiled with + * `T1_CONFIG_OPTION_OLD_ENGINE`. + * + * For the 'cff' module, the default engine is 'adobe'. For both the + * 'type1' and 't1cid' modules, the default engine is 'adobe', too. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 'adobe' or 'freetype'). + * + * @example: + * The following example code demonstrates how to select Adobe's hinting + * engine for the 'cff' module (omitting the error handling). + * + * ``` + * FT_Library library; + * FT_UInt hinting_engine = FT_HINTING_ADOBE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "cff", + * "hinting-engine", &hinting_engine ); + * ``` + * + * @since: + * 2.4.12 (for 'cff' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * no-stem-darkening + * + * @description: + * All glyphs that pass through the auto-hinter will be emboldened unless + * this property is set to TRUE. The same is true for the CFF, Type~1, + * and CID font modules if the 'Adobe' engine is selected (which is the + * default). + * + * Stem darkening emboldens glyphs at smaller sizes to make them more + * readable on common low-DPI screens when using linear alpha blending + * and gamma correction, see @FT_Render_Glyph. When not using linear + * alpha blending and gamma correction, glyphs will appear heavy and + * fuzzy! + * + * Gamma correction essentially lightens fonts since shades of grey are + * shifted to higher pixel values (=~higher brightness) to match the + * original intention to the reality of our screens. The side-effect is + * that glyphs 'thin out'. Mac OS~X and Adobe's proprietary font + * rendering library implement a counter-measure: stem darkening at + * smaller sizes where shades of gray dominate. By emboldening a glyph + * slightly in relation to its pixel size, individual pixels get higher + * coverage of filled-in outlines and are therefore 'blacker'. This + * counteracts the 'thinning out' of glyphs, making text remain readable + * at smaller sizes. + * + * For the auto-hinter, stem-darkening is experimental currently and thus + * switched off by default (this is, `no-stem-darkening` is set to TRUE + * by default). Total consistency with the CFF driver is not achieved + * right now because the emboldening method differs and glyphs must be + * scaled down on the Y-axis to keep outline points inside their + * precomputed blue zones. The smaller the size (especially 9ppem and + * down), the higher the loss of emboldening versus the CFF driver. + * + * Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 1 and 0 for 'on' and 'off', respectively). It + * can also be set per face using @FT_Face_Properties with + * @FT_PARAM_TAG_STEM_DARKENING. + * + * @example: + * ``` + * FT_Library library; + * FT_Bool no_stem_darkening = TRUE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "cff", + * "no-stem-darkening", &no_stem_darkening ); + * ``` + * + * @since: + * 2.4.12 (for 'cff' module) + * + * 2.6.2 (for 'autofitter' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * darkening-parameters + * + * @description: + * By default, the Adobe hinting engine, as used by the CFF, Type~1, and + * CID font drivers, darkens stems as follows (if the `no-stem-darkening` + * property isn't set): + * + * ``` + * stem width <= 0.5px: darkening amount = 0.4px + * stem width = 1px: darkening amount = 0.275px + * stem width = 1.667px: darkening amount = 0.275px + * stem width >= 2.333px: darkening amount = 0px + * ``` + * + * and piecewise linear in-between. At configuration time, these four + * control points can be set with the macro + * `CFF_CONFIG_OPTION_DARKENING_PARAMETERS`; the CFF, Type~1, and CID + * drivers share these values. At runtime, the control points can be + * changed using the `darkening-parameters` property (see the example + * below that demonstrates this for the Type~1 driver). + * + * The x~values give the stem width, and the y~values the darkening + * amount. The unit is 1000th of pixels. All coordinate values must be + * positive; the x~values must be monotonically increasing; the y~values + * must be monotonically decreasing and smaller than or equal to 500 + * (corresponding to half a pixel); the slope of each linear piece must + * be shallower than -1 (e.g., -.4). + * + * The auto-hinter provides this property, too, as an experimental + * feature. See @no-stem-darkening for more. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable, using eight comma-separated integers without spaces. Here + * the above example, using `\` to break the line for readability. + * + * ``` + * FREETYPE_PROPERTIES=\ + * type1:darkening-parameters=500,300,1000,200,1500,100,2000,0 + * ``` + * + * @example: + * ``` + * FT_Library library; + * FT_Int darken_params[8] = { 500, 300, // x1, y1 + * 1000, 200, // x2, y2 + * 1500, 100, // x3, y3 + * 2000, 0 }; // x4, y4 + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "type1", + * "darkening-parameters", darken_params ); + * ``` + * + * @since: + * 2.5.1 (for 'cff' module) + * + * 2.6.2 (for 'autofitter' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * random-seed + * + * @description: + * By default, the seed value for the CFF 'random' operator and the + * similar '0 28 callothersubr pop' command for the Type~1 and CID + * drivers is set to a random value. However, mainly for debugging + * purposes, it is often necessary to use a known value as a seed so that + * the pseudo-random number sequences generated by 'random' are + * repeatable. + * + * The `random-seed` property does that. Its argument is a signed 32bit + * integer; if the value is zero or negative, the seed given by the + * `intitialRandomSeed` private DICT operator in a CFF file gets used (or + * a default value if there is no such operator). If the value is + * positive, use it instead of `initialRandomSeed`, which is consequently + * ignored. + * + * @note: + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable. It can also be set per face using @FT_Face_Properties with + * @FT_PARAM_TAG_RANDOM_SEED. + * + * @since: + * 2.8 (for 'cff' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * no-long-family-names + * + * @description: + * If `PCF_CONFIG_OPTION_LONG_FAMILY_NAMES` is active while compiling + * FreeType, the PCF driver constructs long family names. + * + * There are many PCF fonts just called 'Fixed' which look completely + * different, and which have nothing to do with each other. When + * selecting 'Fixed' in KDE or Gnome one gets results that appear rather + * random, the style changes often if one changes the size and one cannot + * select some fonts at all. The improve this situation, the PCF module + * prepends the foundry name (plus a space) to the family name. It also + * checks whether there are 'wide' characters; all put together, family + * names like 'Sony Fixed' or 'Misc Fixed Wide' are constructed. + * + * If `no-long-family-names` is set, this feature gets switched off. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 1 and 0 for 'on' and 'off', respectively). + * + * @example: + * ``` + * FT_Library library; + * FT_Bool no_long_family_names = TRUE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "pcf", + * "no-long-family-names", + * &no_long_family_names ); + * ``` + * + * @since: + * 2.8 + */ + + + /************************************************************************** + * + * @enum: + * TT_INTERPRETER_VERSION_XXX + * + * @description: + * A list of constants used for the @interpreter-version property to + * select the hinting engine for Truetype fonts. + * + * The numeric value in the constant names represents the version number + * as returned by the 'GETINFO' bytecode instruction. + * + * @values: + * TT_INTERPRETER_VERSION_35 :: + * Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in + * Windows~98; only grayscale and B/W rasterizing is supported. + * + * TT_INTERPRETER_VERSION_38 :: + * Version~38 corresponds to MS rasterizer v.1.9; it is roughly + * equivalent to the hinting provided by DirectWrite ClearType (as can + * be found, for example, in the Internet Explorer~9 running on + * Windows~7). It is used in FreeType to select the 'Infinality' + * subpixel hinting code. The code may be removed in a future version. + * + * TT_INTERPRETER_VERSION_40 :: + * Version~40 corresponds to MS rasterizer v.2.1; it is roughly + * equivalent to the hinting provided by DirectWrite ClearType (as can + * be found, for example, in Microsoft's Edge Browser on Windows~10). + * It is used in FreeType to select the 'minimal' subpixel hinting + * code, a stripped-down and higher performance version of the + * 'Infinality' code. + * + * @note: + * This property controls the behaviour of the bytecode interpreter and + * thus how outlines get hinted. It does **not** control how glyph get + * rasterized! In particular, it does not control subpixel color + * filtering. + * + * If FreeType has not been compiled with the configuration option + * `TT_CONFIG_OPTION_SUBPIXEL_HINTING`, selecting version~38 or~40 causes + * an `FT_Err_Unimplemented_Feature` error. + * + * Depending on the graphics framework, Microsoft uses different bytecode + * and rendering engines. As a consequence, the version numbers returned + * by a call to the 'GETINFO' bytecode instruction are more convoluted + * than desired. + * + * Here are two tables that try to shed some light on the possible values + * for the MS rasterizer engine, together with the additional features + * introduced by it. + * + * ``` + * GETINFO framework version feature + * ------------------------------------------------------------------- + * 3 GDI (Win 3.1), v1.0 16-bit, first version + * TrueImage + * 33 GDI (Win NT 3.1), v1.5 32-bit + * HP Laserjet + * 34 GDI (Win 95) v1.6 font smoothing, + * new SCANTYPE opcode + * 35 GDI (Win 98/2000) v1.7 (UN)SCALED_COMPONENT_OFFSET + * bits in composite glyphs + * 36 MGDI (Win CE 2) v1.6+ classic ClearType + * 37 GDI (XP and later), v1.8 ClearType + * GDI+ old (before Vista) + * 38 GDI+ old (Vista, Win 7), v1.9 subpixel ClearType, + * WPF Y-direction ClearType, + * additional error checking + * 39 DWrite (before Win 8) v2.0 subpixel ClearType flags + * in GETINFO opcode, + * bug fixes + * 40 GDI+ (after Win 7), v2.1 Y-direction ClearType flag + * DWrite (Win 8) in GETINFO opcode, + * Gray ClearType + * ``` + * + * The 'version' field gives a rough orientation only, since some + * applications provided certain features much earlier (as an example, + * Microsoft Reader used subpixel and Y-direction ClearType already in + * Windows 2000). Similarly, updates to a given framework might include + * improved hinting support. + * + * ``` + * version sampling rendering comment + * x y x y + * -------------------------------------------------------------- + * v1.0 normal normal B/W B/W bi-level + * v1.6 high high gray gray grayscale + * v1.8 high normal color-filter B/W (GDI) ClearType + * v1.9 high high color-filter gray Color ClearType + * v2.1 high normal gray B/W Gray ClearType + * v2.1 high high gray gray Gray ClearType + * ``` + * + * Color and Gray ClearType are the two available variants of + * 'Y-direction ClearType', meaning grayscale rasterization along the + * Y-direction; the name used in the TrueType specification for this + * feature is 'symmetric smoothing'. 'Classic ClearType' is the original + * algorithm used before introducing a modified version in Win~XP. + * Another name for v1.6's grayscale rendering is 'font smoothing', and + * 'Color ClearType' is sometimes also called 'DWrite ClearType'. To + * differentiate between today's Color ClearType and the earlier + * ClearType variant with B/W rendering along the vertical axis, the + * latter is sometimes called 'GDI ClearType'. + * + * 'Normal' and 'high' sampling describe the (virtual) resolution to + * access the rasterized outline after the hinting process. 'Normal' + * means 1 sample per grid line (i.e., B/W). In the current Microsoft + * implementation, 'high' means an extra virtual resolution of 16x16 (or + * 16x1) grid lines per pixel for bytecode instructions like 'MIRP'. + * After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid + * lines for color filtering if Color ClearType is activated. + * + * Note that 'Gray ClearType' is essentially the same as v1.6's grayscale + * rendering. However, the GETINFO instruction handles it differently: + * v1.6 returns bit~12 (hinting for grayscale), while v2.1 returns + * bits~13 (hinting for ClearType), 18 (symmetrical smoothing), and~19 + * (Gray ClearType). Also, this mode respects bits 2 and~3 for the + * version~1 gasp table exclusively (like Color ClearType), while v1.6 + * only respects the values of version~0 (bits 0 and~1). + * + * Keep in mind that the features of the above interpreter versions might + * not map exactly to FreeType features or behavior because it is a + * fundamentally different library with different internals. + * + */ +#define TT_INTERPRETER_VERSION_35 35 +#define TT_INTERPRETER_VERSION_38 38 +#define TT_INTERPRETER_VERSION_40 40 + + + /************************************************************************** + * + * @property: + * interpreter-version + * + * @description: + * Currently, three versions are available, two representing the bytecode + * interpreter with subpixel hinting support (old 'Infinality' code and + * new stripped-down and higher performance 'minimal' code) and one + * without, respectively. The default is subpixel support if + * `TT_CONFIG_OPTION_SUBPIXEL_HINTING` is defined, and no subpixel + * support otherwise (since it isn't available then). + * + * If subpixel hinting is on, many TrueType bytecode instructions behave + * differently compared to B/W or grayscale rendering (except if 'native + * ClearType' is selected by the font). Microsoft's main idea is to + * render at a much increased horizontal resolution, then sampling down + * the created output to subpixel precision. However, many older fonts + * are not suited to this and must be specially taken care of by applying + * (hardcoded) tweaks in Microsoft's interpreter. + * + * Details on subpixel hinting and some of the necessary tweaks can be + * found in Greg Hitchcock's whitepaper at + * 'https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'. + * Note that FreeType currently doesn't really 'subpixel hint' (6x1, 6x2, + * or 6x5 supersampling) like discussed in the paper. Depending on the + * chosen interpreter, it simply ignores instructions on vertical stems + * to arrive at very similar results. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values '35', '38', or '40'). + * + * @example: + * The following example code demonstrates how to deactivate subpixel + * hinting (omitting the error handling). + * + * ``` + * FT_Library library; + * FT_Face face; + * FT_UInt interpreter_version = TT_INTERPRETER_VERSION_35; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "truetype", + * "interpreter-version", + * &interpreter_version ); + * ``` + * + * @since: + * 2.5 + */ + + + /************************************************************************** + * + * @property: + * glyph-to-script-map + * + * @description: + * **Experimental only** + * + * The auto-hinter provides various script modules to hint glyphs. + * Examples of supported scripts are Latin or CJK. Before a glyph is + * auto-hinted, the Unicode character map of the font gets examined, and + * the script is then determined based on Unicode character ranges, see + * below. + * + * OpenType fonts, however, often provide much more glyphs than character + * codes (small caps, superscripts, ligatures, swashes, etc.), to be + * controlled by so-called 'features'. Handling OpenType features can be + * quite complicated and thus needs a separate library on top of + * FreeType. + * + * The mapping between glyph indices and scripts (in the auto-hinter + * sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an array + * with `num_glyphs` elements, as found in the font's @FT_Face structure. + * The `glyph-to-script-map` property returns a pointer to this array, + * which can be modified as needed. Note that the modification should + * happen before the first glyph gets processed by the auto-hinter so + * that the global analysis of the font shapes actually uses the modified + * mapping. + * + * @example: + * The following example code demonstrates how to access it (omitting the + * error handling). + * + * ``` + * FT_Library library; + * FT_Face face; + * FT_Prop_GlyphToScriptMap prop; + * + * + * FT_Init_FreeType( &library ); + * FT_New_Face( library, "foo.ttf", 0, &face ); + * + * prop.face = face; + * + * FT_Property_Get( library, "autofitter", + * "glyph-to-script-map", &prop ); + * + * // adjust `prop.map' as needed right here + * + * FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @enum: + * FT_AUTOHINTER_SCRIPT_XXX + * + * @description: + * **Experimental only** + * + * A list of constants used for the @glyph-to-script-map property to + * specify the script submodule the auto-hinter should use for hinting a + * particular glyph. + * + * @values: + * FT_AUTOHINTER_SCRIPT_NONE :: + * Don't auto-hint this glyph. + * + * FT_AUTOHINTER_SCRIPT_LATIN :: + * Apply the latin auto-hinter. For the auto-hinter, 'latin' is a very + * broad term, including Cyrillic and Greek also since characters from + * those scripts share the same design constraints. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+0020 - U+007F // Basic Latin (no control characters) + * U+00A0 - U+00FF // Latin-1 Supplement (no control characters) + * U+0100 - U+017F // Latin Extended-A + * U+0180 - U+024F // Latin Extended-B + * U+0250 - U+02AF // IPA Extensions + * U+02B0 - U+02FF // Spacing Modifier Letters + * U+0300 - U+036F // Combining Diacritical Marks + * U+0370 - U+03FF // Greek and Coptic + * U+0400 - U+04FF // Cyrillic + * U+0500 - U+052F // Cyrillic Supplement + * U+1D00 - U+1D7F // Phonetic Extensions + * U+1D80 - U+1DBF // Phonetic Extensions Supplement + * U+1DC0 - U+1DFF // Combining Diacritical Marks Supplement + * U+1E00 - U+1EFF // Latin Extended Additional + * U+1F00 - U+1FFF // Greek Extended + * U+2000 - U+206F // General Punctuation + * U+2070 - U+209F // Superscripts and Subscripts + * U+20A0 - U+20CF // Currency Symbols + * U+2150 - U+218F // Number Forms + * U+2460 - U+24FF // Enclosed Alphanumerics + * U+2C60 - U+2C7F // Latin Extended-C + * U+2DE0 - U+2DFF // Cyrillic Extended-A + * U+2E00 - U+2E7F // Supplemental Punctuation + * U+A640 - U+A69F // Cyrillic Extended-B + * U+A720 - U+A7FF // Latin Extended-D + * U+FB00 - U+FB06 // Alphab. Present. Forms (Latin Ligatures) + * U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols + * U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement + * ``` + * + * FT_AUTOHINTER_SCRIPT_CJK :: + * Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old + * Vietnamese, and some other scripts. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+1100 - U+11FF // Hangul Jamo + * U+2E80 - U+2EFF // CJK Radicals Supplement + * U+2F00 - U+2FDF // Kangxi Radicals + * U+2FF0 - U+2FFF // Ideographic Description Characters + * U+3000 - U+303F // CJK Symbols and Punctuation + * U+3040 - U+309F // Hiragana + * U+30A0 - U+30FF // Katakana + * U+3100 - U+312F // Bopomofo + * U+3130 - U+318F // Hangul Compatibility Jamo + * U+3190 - U+319F // Kanbun + * U+31A0 - U+31BF // Bopomofo Extended + * U+31C0 - U+31EF // CJK Strokes + * U+31F0 - U+31FF // Katakana Phonetic Extensions + * U+3200 - U+32FF // Enclosed CJK Letters and Months + * U+3300 - U+33FF // CJK Compatibility + * U+3400 - U+4DBF // CJK Unified Ideographs Extension A + * U+4DC0 - U+4DFF // Yijing Hexagram Symbols + * U+4E00 - U+9FFF // CJK Unified Ideographs + * U+A960 - U+A97F // Hangul Jamo Extended-A + * U+AC00 - U+D7AF // Hangul Syllables + * U+D7B0 - U+D7FF // Hangul Jamo Extended-B + * U+F900 - U+FAFF // CJK Compatibility Ideographs + * U+FE10 - U+FE1F // Vertical forms + * U+FE30 - U+FE4F // CJK Compatibility Forms + * U+FF00 - U+FFEF // Halfwidth and Fullwidth Forms + * U+1B000 - U+1B0FF // Kana Supplement + * U+1D300 - U+1D35F // Tai Xuan Hing Symbols + * U+1F200 - U+1F2FF // Enclosed Ideographic Supplement + * U+20000 - U+2A6DF // CJK Unified Ideographs Extension B + * U+2A700 - U+2B73F // CJK Unified Ideographs Extension C + * U+2B740 - U+2B81F // CJK Unified Ideographs Extension D + * U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement + * ``` + * + * FT_AUTOHINTER_SCRIPT_INDIC :: + * Apply the indic auto-hinter, covering all major scripts from the + * Indian sub-continent and some other related scripts like Thai, Lao, + * or Tibetan. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+0900 - U+0DFF // Indic Range + * U+0F00 - U+0FFF // Tibetan + * U+1900 - U+194F // Limbu + * U+1B80 - U+1BBF // Sundanese + * U+A800 - U+A82F // Syloti Nagri + * U+ABC0 - U+ABFF // Meetei Mayek + * U+11800 - U+118DF // Sharada + * ``` + * + * Note that currently Indic support is rudimentary only, missing blue + * zone support. + * + * @since: + * 2.4.11 + * + */ +#define FT_AUTOHINTER_SCRIPT_NONE 0 +#define FT_AUTOHINTER_SCRIPT_LATIN 1 +#define FT_AUTOHINTER_SCRIPT_CJK 2 +#define FT_AUTOHINTER_SCRIPT_INDIC 3 + + + /************************************************************************** + * + * @struct: + * FT_Prop_GlyphToScriptMap + * + * @description: + * **Experimental only** + * + * The data exchange structure for the @glyph-to-script-map property. + * + * @since: + * 2.4.11 + * + */ + typedef struct FT_Prop_GlyphToScriptMap_ + { + FT_Face face; + FT_UShort* map; + + } FT_Prop_GlyphToScriptMap; + + + /************************************************************************** + * + * @property: + * fallback-script + * + * @description: + * **Experimental only** + * + * If no auto-hinter script module can be assigned to a glyph, a fallback + * script gets assigned to it (see also the @glyph-to-script-map + * property). By default, this is @FT_AUTOHINTER_SCRIPT_CJK. Using the + * `fallback-script` property, this fallback value can be changed. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * It's important to use the right timing for changing this value: The + * creation of the glyph-to-script map that eventually uses the fallback + * script value gets triggered either by setting or reading a + * face-specific property like @glyph-to-script-map, or by auto-hinting + * any glyph from that face. In particular, if you have already created + * an @FT_Face structure but not loaded any glyph (using the + * auto-hinter), a change of the fallback script will affect this face. + * + * @example: + * ``` + * FT_Library library; + * FT_UInt fallback_script = FT_AUTOHINTER_SCRIPT_NONE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", + * "fallback-script", &fallback_script ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @property: + * default-script + * + * @description: + * **Experimental only** + * + * If FreeType gets compiled with `FT_CONFIG_OPTION_USE_HARFBUZZ` to make + * the HarfBuzz library access OpenType features for getting better glyph + * coverages, this property sets the (auto-fitter) script to be used for + * the default (OpenType) script data of a font's GSUB table. Features + * for the default script are intended for all scripts not explicitly + * handled in GSUB; an example is a 'dlig' feature, containing the + * combination of the characters 'T', 'E', and 'L' to form a 'TEL' + * ligature. + * + * By default, this is @FT_AUTOHINTER_SCRIPT_LATIN. Using the + * `default-script` property, this default value can be changed. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * It's important to use the right timing for changing this value: The + * creation of the glyph-to-script map that eventually uses the default + * script value gets triggered either by setting or reading a + * face-specific property like @glyph-to-script-map, or by auto-hinting + * any glyph from that face. In particular, if you have already created + * an @FT_Face structure but not loaded any glyph (using the + * auto-hinter), a change of the default script will affect this face. + * + * @example: + * ``` + * FT_Library library; + * FT_UInt default_script = FT_AUTOHINTER_SCRIPT_NONE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", + * "default-script", &default_script ); + * ``` + * + * @since: + * 2.5.3 + * + */ + + + /************************************************************************** + * + * @property: + * increase-x-height + * + * @description: + * For ppem values in the range 6~<= ppem <= `increase-x-height`, round + * up the font's x~height much more often than normally. If the value is + * set to~0, which is the default, this feature is switched off. Use + * this property to improve the legibility of small font sizes if + * necessary. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * Set this value right after calling @FT_Set_Char_Size, but before + * loading any glyph (using the auto-hinter). + * + * @example: + * ``` + * FT_Library library; + * FT_Face face; + * FT_Prop_IncreaseXHeight prop; + * + * + * FT_Init_FreeType( &library ); + * FT_New_Face( library, "foo.ttf", 0, &face ); + * FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 ); + * + * prop.face = face; + * prop.limit = 14; + * + * FT_Property_Set( library, "autofitter", + * "increase-x-height", &prop ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Prop_IncreaseXHeight + * + * @description: + * The data exchange structure for the @increase-x-height property. + * + */ + typedef struct FT_Prop_IncreaseXHeight_ + { + FT_Face face; + FT_UInt limit; + + } FT_Prop_IncreaseXHeight; + + + /************************************************************************** + * + * @property: + * warping + * + * @description: + * **Obsolete** + * + * This property was always experimental and probably never worked + * correctly. It was entirely removed from the FreeType~2 sources. This + * entry is only here for historical reference. + * + * Warping only worked in 'normal' auto-hinting mode replacing it. The + * idea of the code was to slightly scale and shift a glyph along the + * non-hinted dimension (which is usually the horizontal axis) so that as + * much of its segments were aligned (more or less) to the grid. To find + * out a glyph's optimal scaling and shifting value, various parameter + * combinations were tried and scored. + * + * @since: + * 2.6 + * + */ + + + /* */ + + +FT_END_HEADER + + +#endif /* FTDRIVER_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/fterrdef.h b/NothinFancy/dep/include/freetype/fterrdef.h new file mode 100644 index 0000000..6e9c4cc --- /dev/null +++ b/NothinFancy/dep/include/freetype/fterrdef.h @@ -0,0 +1,279 @@ +/**************************************************************************** + * + * fterrdef.h + * + * FreeType error codes (specification). + * + * Copyright (C) 2002-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * @section: + * error_code_values + * + * @title: + * Error Code Values + * + * @abstract: + * All possible error codes returned by FreeType functions. + * + * @description: + * The list below is taken verbatim from the file `fterrdef.h` (loaded + * automatically by including `FT_FREETYPE_H`). The first argument of the + * `FT_ERROR_DEF_` macro is the error label; by default, the prefix + * `FT_Err_` gets added so that you get error names like + * `FT_Err_Cannot_Open_Resource`. The second argument is the error code, + * and the last argument an error string, which is not used by FreeType. + * + * Within your application you should **only** use error names and + * **never** its numeric values! The latter might (and actually do) + * change in forthcoming FreeType versions. + * + * Macro `FT_NOERRORDEF_` defines `FT_Err_Ok`, which is always zero. See + * the 'Error Enumerations' subsection how to automatically generate a + * list of error strings. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_Err_XXX + * + */ + + /* generic errors */ + + FT_NOERRORDEF_( Ok, 0x00, + "no error" ) + + FT_ERRORDEF_( Cannot_Open_Resource, 0x01, + "cannot open resource" ) + FT_ERRORDEF_( Unknown_File_Format, 0x02, + "unknown file format" ) + FT_ERRORDEF_( Invalid_File_Format, 0x03, + "broken file" ) + FT_ERRORDEF_( Invalid_Version, 0x04, + "invalid FreeType version" ) + FT_ERRORDEF_( Lower_Module_Version, 0x05, + "module version is too low" ) + FT_ERRORDEF_( Invalid_Argument, 0x06, + "invalid argument" ) + FT_ERRORDEF_( Unimplemented_Feature, 0x07, + "unimplemented feature" ) + FT_ERRORDEF_( Invalid_Table, 0x08, + "broken table" ) + FT_ERRORDEF_( Invalid_Offset, 0x09, + "broken offset within table" ) + FT_ERRORDEF_( Array_Too_Large, 0x0A, + "array allocation size too large" ) + FT_ERRORDEF_( Missing_Module, 0x0B, + "missing module" ) + FT_ERRORDEF_( Missing_Property, 0x0C, + "missing property" ) + + /* glyph/character errors */ + + FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, + "invalid glyph index" ) + FT_ERRORDEF_( Invalid_Character_Code, 0x11, + "invalid character code" ) + FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, + "unsupported glyph image format" ) + FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, + "cannot render this glyph format" ) + FT_ERRORDEF_( Invalid_Outline, 0x14, + "invalid outline" ) + FT_ERRORDEF_( Invalid_Composite, 0x15, + "invalid composite glyph" ) + FT_ERRORDEF_( Too_Many_Hints, 0x16, + "too many hints" ) + FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, + "invalid pixel size" ) + + /* handle errors */ + + FT_ERRORDEF_( Invalid_Handle, 0x20, + "invalid object handle" ) + FT_ERRORDEF_( Invalid_Library_Handle, 0x21, + "invalid library handle" ) + FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, + "invalid module handle" ) + FT_ERRORDEF_( Invalid_Face_Handle, 0x23, + "invalid face handle" ) + FT_ERRORDEF_( Invalid_Size_Handle, 0x24, + "invalid size handle" ) + FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, + "invalid glyph slot handle" ) + FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, + "invalid charmap handle" ) + FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, + "invalid cache manager handle" ) + FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, + "invalid stream handle" ) + + /* driver errors */ + + FT_ERRORDEF_( Too_Many_Drivers, 0x30, + "too many modules" ) + FT_ERRORDEF_( Too_Many_Extensions, 0x31, + "too many extensions" ) + + /* memory errors */ + + FT_ERRORDEF_( Out_Of_Memory, 0x40, + "out of memory" ) + FT_ERRORDEF_( Unlisted_Object, 0x41, + "unlisted object" ) + + /* stream errors */ + + FT_ERRORDEF_( Cannot_Open_Stream, 0x51, + "cannot open stream" ) + FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, + "invalid stream seek" ) + FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, + "invalid stream skip" ) + FT_ERRORDEF_( Invalid_Stream_Read, 0x54, + "invalid stream read" ) + FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, + "invalid stream operation" ) + FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, + "invalid frame operation" ) + FT_ERRORDEF_( Nested_Frame_Access, 0x57, + "nested frame access" ) + FT_ERRORDEF_( Invalid_Frame_Read, 0x58, + "invalid frame read" ) + + /* raster errors */ + + FT_ERRORDEF_( Raster_Uninitialized, 0x60, + "raster uninitialized" ) + FT_ERRORDEF_( Raster_Corrupted, 0x61, + "raster corrupted" ) + FT_ERRORDEF_( Raster_Overflow, 0x62, + "raster overflow" ) + FT_ERRORDEF_( Raster_Negative_Height, 0x63, + "negative height while rastering" ) + + /* cache errors */ + + FT_ERRORDEF_( Too_Many_Caches, 0x70, + "too many registered caches" ) + + /* TrueType and SFNT errors */ + + FT_ERRORDEF_( Invalid_Opcode, 0x80, + "invalid opcode" ) + FT_ERRORDEF_( Too_Few_Arguments, 0x81, + "too few arguments" ) + FT_ERRORDEF_( Stack_Overflow, 0x82, + "stack overflow" ) + FT_ERRORDEF_( Code_Overflow, 0x83, + "code overflow" ) + FT_ERRORDEF_( Bad_Argument, 0x84, + "bad argument" ) + FT_ERRORDEF_( Divide_By_Zero, 0x85, + "division by zero" ) + FT_ERRORDEF_( Invalid_Reference, 0x86, + "invalid reference" ) + FT_ERRORDEF_( Debug_OpCode, 0x87, + "found debug opcode" ) + FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, + "found ENDF opcode in execution stream" ) + FT_ERRORDEF_( Nested_DEFS, 0x89, + "nested DEFS" ) + FT_ERRORDEF_( Invalid_CodeRange, 0x8A, + "invalid code range" ) + FT_ERRORDEF_( Execution_Too_Long, 0x8B, + "execution context too long" ) + FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, + "too many function definitions" ) + FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, + "too many instruction definitions" ) + FT_ERRORDEF_( Table_Missing, 0x8E, + "SFNT font table missing" ) + FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, + "horizontal header (hhea) table missing" ) + FT_ERRORDEF_( Locations_Missing, 0x90, + "locations (loca) table missing" ) + FT_ERRORDEF_( Name_Table_Missing, 0x91, + "name table missing" ) + FT_ERRORDEF_( CMap_Table_Missing, 0x92, + "character map (cmap) table missing" ) + FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, + "horizontal metrics (hmtx) table missing" ) + FT_ERRORDEF_( Post_Table_Missing, 0x94, + "PostScript (post) table missing" ) + FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, + "invalid horizontal metrics" ) + FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, + "invalid character map (cmap) format" ) + FT_ERRORDEF_( Invalid_PPem, 0x97, + "invalid ppem value" ) + FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, + "invalid vertical metrics" ) + FT_ERRORDEF_( Could_Not_Find_Context, 0x99, + "could not find context" ) + FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, + "invalid PostScript (post) table format" ) + FT_ERRORDEF_( Invalid_Post_Table, 0x9B, + "invalid PostScript (post) table" ) + FT_ERRORDEF_( DEF_In_Glyf_Bytecode, 0x9C, + "found FDEF or IDEF opcode in glyf bytecode" ) + FT_ERRORDEF_( Missing_Bitmap, 0x9D, + "missing bitmap in strike" ) + + /* CFF, CID, and Type 1 errors */ + + FT_ERRORDEF_( Syntax_Error, 0xA0, + "opcode syntax error" ) + FT_ERRORDEF_( Stack_Underflow, 0xA1, + "argument stack underflow" ) + FT_ERRORDEF_( Ignore, 0xA2, + "ignore" ) + FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, + "no Unicode glyph name found" ) + FT_ERRORDEF_( Glyph_Too_Big, 0xA4, + "glyph too big for hinting" ) + + /* BDF errors */ + + FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, + "`STARTFONT' field missing" ) + FT_ERRORDEF_( Missing_Font_Field, 0xB1, + "`FONT' field missing" ) + FT_ERRORDEF_( Missing_Size_Field, 0xB2, + "`SIZE' field missing" ) + FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, + "`FONTBOUNDINGBOX' field missing" ) + FT_ERRORDEF_( Missing_Chars_Field, 0xB4, + "`CHARS' field missing" ) + FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, + "`STARTCHAR' field missing" ) + FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, + "`ENCODING' field missing" ) + FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, + "`BBX' field missing" ) + FT_ERRORDEF_( Bbx_Too_Big, 0xB8, + "`BBX' too big" ) + FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, + "Font header corrupted or missing fields" ) + FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, + "Font glyphs corrupted or missing fields" ) + + /* */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/fterrors.h b/NothinFancy/dep/include/freetype/fterrors.h new file mode 100644 index 0000000..151941d --- /dev/null +++ b/NothinFancy/dep/include/freetype/fterrors.h @@ -0,0 +1,296 @@ +/**************************************************************************** + * + * fterrors.h + * + * FreeType error code handling (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * @section: + * error_enumerations + * + * @title: + * Error Enumerations + * + * @abstract: + * How to handle errors and error strings. + * + * @description: + * The header file `fterrors.h` (which is automatically included by + * `freetype.h` defines the handling of FreeType's enumeration + * constants. It can also be used to generate error message strings + * with a small macro trick explained below. + * + * **Error Formats** + * + * The configuration macro `FT_CONFIG_OPTION_USE_MODULE_ERRORS` can be + * defined in `ftoption.h` in order to make the higher byte indicate the + * module where the error has happened (this is not compatible with + * standard builds of FreeType~2, however). See the file `ftmoderr.h` + * for more details. + * + * **Error Message Strings** + * + * Error definitions are set up with special macros that allow client + * applications to build a table of error message strings. The strings + * are not included in a normal build of FreeType~2 to save space (most + * client applications do not use them). + * + * To do so, you have to define the following macros before including + * this file. + * + * ``` + * FT_ERROR_START_LIST + * ``` + * + * This macro is called before anything else to define the start of the + * error list. It is followed by several `FT_ERROR_DEF` calls. + * + * ``` + * FT_ERROR_DEF( e, v, s ) + * ``` + * + * This macro is called to define one single error. 'e' is the error + * code identifier (e.g., `Invalid_Argument`), 'v' is the error's + * numerical value, and 's' is the corresponding error string. + * + * ``` + * FT_ERROR_END_LIST + * ``` + * + * This macro ends the list. + * + * Additionally, you have to undefine `FTERRORS_H_` before #including + * this file. + * + * Here is a simple example. + * + * ``` + * #undef FTERRORS_H_ + * #define FT_ERRORDEF( e, v, s ) { e, s }, + * #define FT_ERROR_START_LIST { + * #define FT_ERROR_END_LIST { 0, NULL } }; + * + * const struct + * { + * int err_code; + * const char* err_msg; + * } ft_errors[] = + * + * #include + * ``` + * + * An alternative to using an array is a switch statement. + * + * ``` + * #undef FTERRORS_H_ + * #define FT_ERROR_START_LIST switch ( error_code ) { + * #define FT_ERRORDEF( e, v, s ) case v: return s; + * #define FT_ERROR_END_LIST } + * ``` + * + * If you use `FT_CONFIG_OPTION_USE_MODULE_ERRORS`, `error_code` should + * be replaced with `FT_ERROR_BASE(error_code)` in the last example. + */ + + /* */ + + /* In previous FreeType versions we used `__FTERRORS_H__`. However, */ + /* using two successive underscores in a non-system symbol name */ + /* violates the C (and C++) standard, so it was changed to the */ + /* current form. In spite of this, we have to make */ + /* */ + /* ``` */ + /* #undefine __FTERRORS_H__ */ + /* ``` */ + /* */ + /* work for backward compatibility. */ + /* */ +#if !( defined( FTERRORS_H_ ) && defined ( __FTERRORS_H__ ) ) +#define FTERRORS_H_ +#define __FTERRORS_H__ + + + /* include module base error codes */ +#include + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + + + /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ + /* By default, we use `FT_Err_`. */ + /* */ +#ifndef FT_ERR_PREFIX +#define FT_ERR_PREFIX FT_Err_ +#endif + + + /* FT_ERR_BASE is used as the base for module-specific errors. */ + /* */ +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +#ifndef FT_ERR_BASE +#define FT_ERR_BASE FT_Mod_Err_Base +#endif + +#else + +#undef FT_ERR_BASE +#define FT_ERR_BASE 0 + +#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ + + + /* If FT_ERRORDEF is not defined, we need to define a simple */ + /* enumeration type. */ + /* */ +#ifndef FT_ERRORDEF + +#define FT_INCLUDE_ERR_PROTOS + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + + /* this macro is used to define an error */ +#define FT_ERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) + + /* this is only used for _Err_Ok, which must be 0! */ +#define FT_NOERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + + /* now include the error codes */ +#include + + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SIMPLE CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#undef FT_ERRORDEF +#undef FT_ERRORDEF_ +#undef FT_NOERRORDEF_ + +#undef FT_NEED_EXTERN_C +#undef FT_ERR_BASE + + /* FT_ERR_PREFIX is needed internally */ +#ifndef FT2_BUILD_LIBRARY +#undef FT_ERR_PREFIX +#endif + + /* FT_INCLUDE_ERR_PROTOS: Control whether function prototypes should be */ + /* included with */ + /* */ + /* #include */ + /* */ + /* This is only true where `FT_ERRORDEF` is */ + /* undefined. */ + /* */ + /* FT_ERR_PROTOS_DEFINED: Actual multiple-inclusion protection of */ + /* `fterrors.h`. */ +#ifdef FT_INCLUDE_ERR_PROTOS +#undef FT_INCLUDE_ERR_PROTOS + +#ifndef FT_ERR_PROTOS_DEFINED +#define FT_ERR_PROTOS_DEFINED + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @function: + * FT_Error_String + * + * @description: + * Retrieve the description of a valid FreeType error code. + * + * @input: + * error_code :: + * A valid FreeType error code. + * + * @return: + * A C~string or `NULL`, if any error occurred. + * + * @note: + * FreeType has to be compiled with `FT_CONFIG_OPTION_ERROR_STRINGS` or + * `FT_DEBUG_LEVEL_ERROR` to get meaningful descriptions. + * 'error_string' will be `NULL` otherwise. + * + * Module identification will be ignored: + * + * ```c + * strcmp( FT_Error_String( FT_Err_Unknown_File_Format ), + * FT_Error_String( BDF_Err_Unknown_File_Format ) ) == 0; + * ``` + */ + FT_EXPORT( const char* ) + FT_Error_String( FT_Error error_code ); + + /* */ + +FT_END_HEADER + + +#endif /* FT_ERR_PROTOS_DEFINED */ + +#endif /* FT_INCLUDE_ERR_PROTOS */ + +#endif /* !(FTERRORS_H_ && __FTERRORS_H__) */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftfntfmt.h b/NothinFancy/dep/include/freetype/ftfntfmt.h new file mode 100644 index 0000000..8e68a4a --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftfntfmt.h @@ -0,0 +1,93 @@ +/**************************************************************************** + * + * ftfntfmt.h + * + * Support functions for font formats. + * + * Copyright (C) 2002-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTFNTFMT_H_ +#define FTFNTFMT_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * font_formats + * + * @title: + * Font Formats + * + * @abstract: + * Getting the font format. + * + * @description: + * The single function in this section can be used to get the font format. + * Note that this information is not needed normally; however, there are + * special cases (like in PDF devices) where it is important to + * differentiate, in spite of FreeType's uniform API. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_Font_Format + * + * @description: + * Return a string describing the format of a given face. Possible values + * are 'TrueType', 'Type~1', 'BDF', 'PCF', 'Type~42', 'CID~Type~1', 'CFF', + * 'PFR', and 'Windows~FNT'. + * + * The return value is suitable to be used as an X11 FONT_PROPERTY. + * + * @input: + * face :: + * Input face handle. + * + * @return: + * Font format string. `NULL` in case of error. + * + * @note: + * A deprecated name for the same function is `FT_Get_X11_Font_Format`. + */ + FT_EXPORT( const char* ) + FT_Get_Font_Format( FT_Face face ); + + + /* deprecated */ + FT_EXPORT( const char* ) + FT_Get_X11_Font_Format( FT_Face face ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTFNTFMT_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftgasp.h b/NothinFancy/dep/include/freetype/ftgasp.h new file mode 100644 index 0000000..76c45eb --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftgasp.h @@ -0,0 +1,143 @@ +/**************************************************************************** + * + * ftgasp.h + * + * Access of TrueType's 'gasp' table (specification). + * + * Copyright (C) 2007-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTGASP_H_ +#define FTGASP_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * gasp_table + * + * @title: + * Gasp Table + * + * @abstract: + * Retrieving TrueType 'gasp' table entries. + * + * @description: + * The function @FT_Get_Gasp can be used to query a TrueType or OpenType + * font for specific entries in its 'gasp' table, if any. This is mainly + * useful when implementing native TrueType hinting with the bytecode + * interpreter to duplicate the Windows text rendering results. + */ + + /************************************************************************** + * + * @enum: + * FT_GASP_XXX + * + * @description: + * A list of values and/or bit-flags returned by the @FT_Get_Gasp + * function. + * + * @values: + * FT_GASP_NO_TABLE :: + * This special value means that there is no GASP table in this face. + * It is up to the client to decide what to do. + * + * FT_GASP_DO_GRIDFIT :: + * Grid-fitting and hinting should be performed at the specified ppem. + * This **really** means TrueType bytecode interpretation. If this bit + * is not set, no hinting gets applied. + * + * FT_GASP_DO_GRAY :: + * Anti-aliased rendering should be performed at the specified ppem. + * If not set, do monochrome rendering. + * + * FT_GASP_SYMMETRIC_SMOOTHING :: + * If set, smoothing along multiple axes must be used with ClearType. + * + * FT_GASP_SYMMETRIC_GRIDFIT :: + * Grid-fitting must be used with ClearType's symmetric smoothing. + * + * @note: + * The bit-flags `FT_GASP_DO_GRIDFIT` and `FT_GASP_DO_GRAY` are to be + * used for standard font rasterization only. Independently of that, + * `FT_GASP_SYMMETRIC_SMOOTHING` and `FT_GASP_SYMMETRIC_GRIDFIT` are to + * be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT` and + * `FT_GASP_DO_GRAY` are consequently ignored). + * + * 'ClearType' is Microsoft's implementation of LCD rendering, partly + * protected by patents. + * + * @since: + * 2.3.0 + */ +#define FT_GASP_NO_TABLE -1 +#define FT_GASP_DO_GRIDFIT 0x01 +#define FT_GASP_DO_GRAY 0x02 +#define FT_GASP_SYMMETRIC_GRIDFIT 0x04 +#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 + + + /************************************************************************** + * + * @function: + * FT_Get_Gasp + * + * @description: + * For a TrueType or OpenType font file, return the rasterizer behaviour + * flags from the font's 'gasp' table corresponding to a given character + * pixel size. + * + * @input: + * face :: + * The source face handle. + * + * ppem :: + * The vertical character pixel size. + * + * @return: + * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no + * 'gasp' table in the face. + * + * @note: + * If you want to use the MM functionality of OpenType variation fonts + * (i.e., using @FT_Set_Var_Design_Coordinates and friends), call this + * function **after** setting an instance since the return values can + * change. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGASP_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftglyph.h b/NothinFancy/dep/include/freetype/ftglyph.h new file mode 100644 index 0000000..479267b --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftglyph.h @@ -0,0 +1,664 @@ +/**************************************************************************** + * + * ftglyph.h + * + * FreeType convenience functions to handle glyphs (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file contains the definition of several convenience functions that + * can be used by client applications to easily retrieve glyph bitmaps and + * outlines from a given face. + * + * These functions should be optional if you are writing a font server or + * text layout engine on top of FreeType. However, they are pretty handy + * for many other simple uses of the library. + * + */ + + +#ifndef FTGLYPH_H_ +#define FTGLYPH_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * glyph_management + * + * @title: + * Glyph Management + * + * @abstract: + * Generic interface to manage individual glyph data. + * + * @description: + * This section contains definitions used to manage glyph data through + * generic @FT_Glyph objects. Each of them can contain a bitmap, + * a vector outline, or even images in other formats. These objects are + * detached from @FT_Face, contrary to @FT_GlyphSlot. + * + */ + + + /* forward declaration to a private type */ + typedef struct FT_Glyph_Class_ FT_Glyph_Class; + + + /************************************************************************** + * + * @type: + * FT_Glyph + * + * @description: + * Handle to an object used to model generic glyph images. It is a + * pointer to the @FT_GlyphRec structure and can contain a glyph bitmap + * or pointer. + * + * @note: + * Glyph objects are not owned by the library. You must thus release + * them manually (through @FT_Done_Glyph) _before_ calling + * @FT_Done_FreeType. + */ + typedef struct FT_GlyphRec_* FT_Glyph; + + + /************************************************************************** + * + * @struct: + * FT_GlyphRec + * + * @description: + * The root glyph structure contains a given glyph image plus its advance + * width in 16.16 fixed-point format. + * + * @fields: + * library :: + * A handle to the FreeType library object. + * + * clazz :: + * A pointer to the glyph's class. Private. + * + * format :: + * The format of the glyph's image. + * + * advance :: + * A 16.16 vector that gives the glyph's advance width. + */ + typedef struct FT_GlyphRec_ + { + FT_Library library; + const FT_Glyph_Class* clazz; + FT_Glyph_Format format; + FT_Vector advance; + + } FT_GlyphRec; + + + /************************************************************************** + * + * @type: + * FT_BitmapGlyph + * + * @description: + * A handle to an object used to model a bitmap glyph image. This is a + * sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. + */ + typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; + + + /************************************************************************** + * + * @struct: + * FT_BitmapGlyphRec + * + * @description: + * A structure used for bitmap glyph images. This really is a + * 'sub-class' of @FT_GlyphRec. + * + * @fields: + * root :: + * The root @FT_Glyph fields. + * + * left :: + * The left-side bearing, i.e., the horizontal distance from the + * current pen position to the left border of the glyph bitmap. + * + * top :: + * The top-side bearing, i.e., the vertical distance from the current + * pen position to the top border of the glyph bitmap. This distance + * is positive for upwards~y! + * + * bitmap :: + * A descriptor for the bitmap. + * + * @note: + * You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have + * `glyph->format == FT_GLYPH_FORMAT_BITMAP`. This lets you access the + * bitmap's contents easily. + * + * The corresponding pixel buffer is always owned by @FT_BitmapGlyph and + * is thus created and destroyed with it. + */ + typedef struct FT_BitmapGlyphRec_ + { + FT_GlyphRec root; + FT_Int left; + FT_Int top; + FT_Bitmap bitmap; + + } FT_BitmapGlyphRec; + + + /************************************************************************** + * + * @type: + * FT_OutlineGlyph + * + * @description: + * A handle to an object used to model an outline glyph image. This is a + * sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. + */ + typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; + + + /************************************************************************** + * + * @struct: + * FT_OutlineGlyphRec + * + * @description: + * A structure used for outline (vectorial) glyph images. This really is + * a 'sub-class' of @FT_GlyphRec. + * + * @fields: + * root :: + * The root @FT_Glyph fields. + * + * outline :: + * A descriptor for the outline. + * + * @note: + * You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have + * `glyph->format == FT_GLYPH_FORMAT_OUTLINE`. This lets you access the + * outline's content easily. + * + * As the outline is extracted from a glyph slot, its coordinates are + * expressed normally in 26.6 pixels, unless the flag @FT_LOAD_NO_SCALE + * was used in @FT_Load_Glyph or @FT_Load_Char. + * + * The outline's tables are always owned by the object and are destroyed + * with it. + */ + typedef struct FT_OutlineGlyphRec_ + { + FT_GlyphRec root; + FT_Outline outline; + + } FT_OutlineGlyphRec; + + + /************************************************************************** + * + * @function: + * FT_New_Glyph + * + * @description: + * A function used to create a new empty glyph image. Note that the + * created @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * library :: + * A handle to the FreeType library object. + * + * format :: + * The format of the glyph's image. + * + * @output: + * aglyph :: + * A handle to the glyph object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_New_Glyph( FT_Library library, + FT_Glyph_Format format, + FT_Glyph *aglyph ); + + + /************************************************************************** + * + * @function: + * FT_Get_Glyph + * + * @description: + * A function used to extract a glyph image from a slot. Note that the + * created @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * slot :: + * A handle to the source glyph slot. + * + * @output: + * aglyph :: + * A handle to the glyph object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Because `*aglyph->advance.x` and `*aglyph->advance.y` are 16.16 + * fixed-point numbers, `slot->advance.x` and `slot->advance.y` (which + * are in 26.6 fixed-point format) must be in the range ]-32768;32768[. + */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Copy + * + * @description: + * A function used to copy a glyph image. Note that the created + * @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * source :: + * A handle to the source glyph object. + * + * @output: + * target :: + * A handle to the target glyph object. 0~in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Transform + * + * @description: + * Transform a glyph image if its format is scalable. + * + * @inout: + * glyph :: + * A handle to the target glyph object. + * + * @input: + * matrix :: + * A pointer to a 2x2 matrix to apply. + * + * delta :: + * A pointer to a 2d vector to apply. Coordinates are expressed in + * 1/64th of a pixel. + * + * @return: + * FreeType error code (if not 0, the glyph format is not scalable). + * + * @note: + * The 2x2 transformation matrix is also applied to the glyph's advance + * vector. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /************************************************************************** + * + * @enum: + * FT_Glyph_BBox_Mode + * + * @description: + * The mode how the values of @FT_Glyph_Get_CBox are returned. + * + * @values: + * FT_GLYPH_BBOX_UNSCALED :: + * Return unscaled font units. + * + * FT_GLYPH_BBOX_SUBPIXELS :: + * Return unfitted 26.6 coordinates. + * + * FT_GLYPH_BBOX_GRIDFIT :: + * Return grid-fitted 26.6 coordinates. + * + * FT_GLYPH_BBOX_TRUNCATE :: + * Return coordinates in integer pixels. + * + * FT_GLYPH_BBOX_PIXELS :: + * Return grid-fitted pixel coordinates. + */ + typedef enum FT_Glyph_BBox_Mode_ + { + FT_GLYPH_BBOX_UNSCALED = 0, + FT_GLYPH_BBOX_SUBPIXELS = 0, + FT_GLYPH_BBOX_GRIDFIT = 1, + FT_GLYPH_BBOX_TRUNCATE = 2, + FT_GLYPH_BBOX_PIXELS = 3 + + } FT_Glyph_BBox_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Glyph_BBox_Mode` values instead */ +#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED +#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS +#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT +#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE +#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS + + + /************************************************************************** + * + * @function: + * FT_Glyph_Get_CBox + * + * @description: + * Return a glyph's 'control box'. The control box encloses all the + * outline's points, including Bezier control points. Though it + * coincides with the exact bounding box for most glyphs, it can be + * slightly larger in some situations (like when rotating an outline that + * contains Bezier outside arcs). + * + * Computing the control box is very fast, while getting the bounding box + * can take much more time as it needs to walk over all segments and arcs + * in the outline. To get the latter, you can use the 'ftbbox' + * component, which is dedicated to this single task. + * + * @input: + * glyph :: + * A handle to the source glyph object. + * + * mode :: + * The mode that indicates how to interpret the returned bounding box + * values. + * + * @output: + * acbox :: + * The glyph coordinate bounding box. Coordinates are expressed in + * 1/64th of pixels if it is grid-fitted. + * + * @note: + * Coordinates are relative to the glyph origin, using the y~upwards + * convention. + * + * If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode` must + * be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font units in 26.6 + * pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS is another name for + * this constant. + * + * If the font is tricky and the glyph has been loaded with + * @FT_LOAD_NO_SCALE, the resulting CBox is meaningless. To get + * reasonable values for the CBox it is necessary to load the glyph at a + * large ppem value (so that the hinting instructions can properly shift + * and scale the subglyphs), then extracting the CBox, which can be + * eventually converted back to font units. + * + * Note that the maximum coordinates are exclusive, which means that one + * can compute the width and height of the glyph image (be it in integer + * or 26.6 pixels) as: + * + * ``` + * width = bbox.xMax - bbox.xMin; + * height = bbox.yMax - bbox.yMin; + * ``` + * + * Note also that for 26.6 coordinates, if `bbox_mode` is set to + * @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, + * which corresponds to: + * + * ``` + * bbox.xMin = FLOOR(bbox.xMin); + * bbox.yMin = FLOOR(bbox.yMin); + * bbox.xMax = CEILING(bbox.xMax); + * bbox.yMax = CEILING(bbox.yMax); + * ``` + * + * To get the bbox in pixel coordinates, set `bbox_mode` to + * @FT_GLYPH_BBOX_TRUNCATE. + * + * To get the bbox in grid-fitted pixel coordinates, set `bbox_mode` to + * @FT_GLYPH_BBOX_PIXELS. + */ + FT_EXPORT( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_To_Bitmap + * + * @description: + * Convert a given glyph object to a bitmap glyph object. + * + * @inout: + * the_glyph :: + * A pointer to a handle to the target glyph. + * + * @input: + * render_mode :: + * An enumeration that describes how the data is rendered. + * + * origin :: + * A pointer to a vector used to translate the glyph image before + * rendering. Can be~0 (if no translation). The origin is expressed + * in 26.6 pixels. + * + * destroy :: + * A boolean that indicates that the original glyph image should be + * destroyed by this function. It is never destroyed in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does nothing if the glyph format isn't scalable. + * + * The glyph image is translated with the `origin` vector before + * rendering. + * + * The first parameter is a pointer to an @FT_Glyph handle, that will be + * _replaced_ by this function (with newly allocated data). Typically, + * you would use (omitting error handling): + * + * ``` + * FT_Glyph glyph; + * FT_BitmapGlyph glyph_bitmap; + * + * + * // load glyph + * error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAULT ); + * + * // extract glyph image + * error = FT_Get_Glyph( face->glyph, &glyph ); + * + * // convert to a bitmap (default render mode + destroying old) + * if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) + * { + * error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, + * 0, 1 ); + * if ( error ) // `glyph' unchanged + * ... + * } + * + * // access bitmap content by typecasting + * glyph_bitmap = (FT_BitmapGlyph)glyph; + * + * // do funny stuff with it, like blitting/drawing + * ... + * + * // discard glyph image (bitmap or not) + * FT_Done_Glyph( glyph ); + * ``` + * + * Here is another example, again without error handling: + * + * ``` + * FT_Glyph glyphs[MAX_GLYPHS] + * + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || + * FT_Get_Glyph ( face->glyph, &glyphs[idx] ); + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * { + * FT_Glyph bitmap = glyphs[idx]; + * + * + * ... + * + * // after this call, `bitmap' no longer points into + * // the `glyphs' array (and the old value isn't destroyed) + * FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); + * + * ... + * + * FT_Done_Glyph( bitmap ); + * } + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * FT_Done_Glyph( glyphs[idx] ); + * ``` + */ + FT_EXPORT( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ); + + + /************************************************************************** + * + * @function: + * FT_Done_Glyph + * + * @description: + * Destroy a given glyph. + * + * @input: + * glyph :: + * A handle to the target glyph object. + */ + FT_EXPORT( void ) + FT_Done_Glyph( FT_Glyph glyph ); + + /* */ + + + /* other helpful functions */ + + /************************************************************************** + * + * @section: + * computations + * + */ + + + /************************************************************************** + * + * @function: + * FT_Matrix_Multiply + * + * @description: + * Perform the matrix operation `b = a*b`. + * + * @input: + * a :: + * A pointer to matrix `a`. + * + * @inout: + * b :: + * A pointer to matrix `b`. + * + * @note: + * The result is undefined if either `a` or `b` is zero. + * + * Since the function uses wrap-around arithmetic, results become + * meaningless if the arguments are very large. + */ + FT_EXPORT( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix* b ); + + + /************************************************************************** + * + * @function: + * FT_Matrix_Invert + * + * @description: + * Invert a 2x2 matrix. Return an error if it can't be inverted. + * + * @inout: + * matrix :: + * A pointer to the target matrix. Remains untouched in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGLYPH_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/NothinFancy/dep/include/freetype/ftgxval.h b/NothinFancy/dep/include/freetype/ftgxval.h new file mode 100644 index 0000000..21bbbde --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftgxval.h @@ -0,0 +1,354 @@ +/**************************************************************************** + * + * ftgxval.h + * + * FreeType API for validating TrueTypeGX/AAT tables (specification). + * + * Copyright (C) 2004-2021 by + * Masatake YAMATO, Redhat K.K, + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#ifndef FTGXVAL_H_ +#define FTGXVAL_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * gx_validation + * + * @title: + * TrueTypeGX/AAT Validation + * + * @abstract: + * An API to validate TrueTypeGX/AAT tables. + * + * @description: + * This section contains the declaration of functions to validate some + * TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, trak, + * prop, lcar). + * + * @order: + * FT_TrueTypeGX_Validate + * FT_TrueTypeGX_Free + * + * FT_ClassicKern_Validate + * FT_ClassicKern_Free + * + * FT_VALIDATE_GX_LENGTH + * FT_VALIDATE_GXXXX + * FT_VALIDATE_CKERNXXX + * + */ + + /************************************************************************** + * + * + * Warning: Use `FT_VALIDATE_XXX` to validate a table. + * Following definitions are for gxvalid developers. + * + * + */ + +#define FT_VALIDATE_feat_INDEX 0 +#define FT_VALIDATE_mort_INDEX 1 +#define FT_VALIDATE_morx_INDEX 2 +#define FT_VALIDATE_bsln_INDEX 3 +#define FT_VALIDATE_just_INDEX 4 +#define FT_VALIDATE_kern_INDEX 5 +#define FT_VALIDATE_opbd_INDEX 6 +#define FT_VALIDATE_trak_INDEX 7 +#define FT_VALIDATE_prop_INDEX 8 +#define FT_VALIDATE_lcar_INDEX 9 +#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX + + + /************************************************************************** + * + * @macro: + * FT_VALIDATE_GX_LENGTH + * + * @description: + * The number of tables checked in this module. Use it as a parameter + * for the `table-length` argument of function @FT_TrueTypeGX_Validate. + */ +#define FT_VALIDATE_GX_LENGTH ( FT_VALIDATE_GX_LAST_INDEX + 1 ) + + /* */ + + /* Up to 0x1000 is used by otvalid. + Ox2xxx is reserved for feature OT extension. */ +#define FT_VALIDATE_GX_START 0x4000 +#define FT_VALIDATE_GX_BITFIELD( tag ) \ + ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_GXXXX + * + * @description: + * A list of bit-field constants used with @FT_TrueTypeGX_Validate to + * indicate which TrueTypeGX/AAT Type tables should be validated. + * + * @values: + * FT_VALIDATE_feat :: + * Validate 'feat' table. + * + * FT_VALIDATE_mort :: + * Validate 'mort' table. + * + * FT_VALIDATE_morx :: + * Validate 'morx' table. + * + * FT_VALIDATE_bsln :: + * Validate 'bsln' table. + * + * FT_VALIDATE_just :: + * Validate 'just' table. + * + * FT_VALIDATE_kern :: + * Validate 'kern' table. + * + * FT_VALIDATE_opbd :: + * Validate 'opbd' table. + * + * FT_VALIDATE_trak :: + * Validate 'trak' table. + * + * FT_VALIDATE_prop :: + * Validate 'prop' table. + * + * FT_VALIDATE_lcar :: + * Validate 'lcar' table. + * + * FT_VALIDATE_GX :: + * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, + * opbd, trak, prop and lcar). + * + */ + +#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) +#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) +#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) +#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) +#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) +#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) +#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) +#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) +#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) +#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) + +#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ + FT_VALIDATE_mort | \ + FT_VALIDATE_morx | \ + FT_VALIDATE_bsln | \ + FT_VALIDATE_just | \ + FT_VALIDATE_kern | \ + FT_VALIDATE_opbd | \ + FT_VALIDATE_trak | \ + FT_VALIDATE_prop | \ + FT_VALIDATE_lcar ) + + + /************************************************************************** + * + * @function: + * FT_TrueTypeGX_Validate + * + * @description: + * Validate various TrueTypeGX tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library that + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the tables to be validated. See + * @FT_VALIDATE_GXXXX for possible values. + * + * table_length :: + * The size of the `tables` array. Normally, @FT_VALIDATE_GX_LENGTH + * should be passed. + * + * @output: + * tables :: + * The array where all validated sfnt tables are stored. The array + * itself must be allocated by a client. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with TrueTypeGX fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the buffers pointed to by + * each `tables` element, by calling @FT_TrueTypeGX_Free. A `NULL` value + * indicates that the table either doesn't exist in the font, the + * application hasn't asked for validation, or the validator doesn't have + * the ability to validate the sfnt table. + */ + FT_EXPORT( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + /************************************************************************** + * + * @function: + * FT_TrueTypeGX_Free + * + * @description: + * Free the buffer allocated by TrueTypeGX validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer allocated by @FT_TrueTypeGX_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_TrueTypeGX_Validate only. + */ + FT_EXPORT( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ); + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_CKERNXXX + * + * @description: + * A list of bit-field constants used with @FT_ClassicKern_Validate to + * indicate the classic kern dialect or dialects. If the selected type + * doesn't fit, @FT_ClassicKern_Validate regards the table as invalid. + * + * @values: + * FT_VALIDATE_MS :: + * Handle the 'kern' table as a classic Microsoft kern table. + * + * FT_VALIDATE_APPLE :: + * Handle the 'kern' table as a classic Apple kern table. + * + * FT_VALIDATE_CKERN :: + * Handle the 'kern' as either classic Apple or Microsoft kern table. + */ +#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) +#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) + +#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) + + + /************************************************************************** + * + * @function: + * FT_ClassicKern_Validate + * + * @description: + * Validate classic (16-bit format) kern table to assure that the + * offsets and indices are valid. The idea is that a higher-level + * library that actually does the text layout can access those tables + * without error checking (which can be quite time consuming). + * + * The 'kern' table validator in @FT_TrueTypeGX_Validate deals with both + * the new 32-bit format and the classic 16-bit format, while + * FT_ClassicKern_Validate only supports the classic 16-bit format. + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the dialect to be validated. See + * @FT_VALIDATE_CKERNXXX for possible values. + * + * @output: + * ckern_table :: + * A pointer to the kern table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * After use, the application should deallocate the buffers pointed to by + * `ckern_table`, by calling @FT_ClassicKern_Free. A `NULL` value + * indicates that the table doesn't exist in the font. + */ + FT_EXPORT( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ); + + + /************************************************************************** + * + * @function: + * FT_ClassicKern_Free + * + * @description: + * Free the buffer allocated by classic Kern validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_ClassicKern_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_ClassicKern_Validate only. + */ + FT_EXPORT( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGXVAL_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftgzip.h b/NothinFancy/dep/include/freetype/ftgzip.h new file mode 100644 index 0000000..ba82bab --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftgzip.h @@ -0,0 +1,151 @@ +/**************************************************************************** + * + * ftgzip.h + * + * Gzip-compressed stream support. + * + * Copyright (C) 2002-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTGZIP_H_ +#define FTGZIP_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * gzip + * + * @title: + * GZIP Streams + * + * @abstract: + * Using gzip-compressed font files. + * + * @description: + * In certain builds of the library, gzip compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a gzipped stream from it + * and re-open the face with it. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream, + * which significantly undermines the performance. + * + * This section contains the declaration of Gzip-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Stream_OpenGzip + * + * @description: + * Open a new stream to parse gzip-compressed font files. This is mainly + * used to support the compressed `*.pcf.gz` fonts that come with + * XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with zlib support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ); + + + /************************************************************************** + * + * @function: + * FT_Gzip_Uncompress + * + * @description: + * Decompress a zipped input buffer into an output buffer. This function + * is modeled after zlib's `uncompress` function. + * + * @input: + * memory :: + * A FreeType memory handle. + * + * input :: + * The input buffer. + * + * input_len :: + * The length of the input buffer. + * + * @output: + * output :: + * The output buffer. + * + * @inout: + * output_len :: + * Before calling the function, this is the total size of the output + * buffer, which must be large enough to hold the entire uncompressed + * data (so the size of the uncompressed data must be known in + * advance). After calling the function, `output_len` is the size of + * the used data in `output`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with zlib support. + * + * @since: + * 2.5.1 + */ + FT_EXPORT( FT_Error ) + FT_Gzip_Uncompress( FT_Memory memory, + FT_Byte* output, + FT_ULong* output_len, + const FT_Byte* input, + FT_ULong input_len ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGZIP_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftimage.h b/NothinFancy/dep/include/freetype/ftimage.h new file mode 100644 index 0000000..66a8b89 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftimage.h @@ -0,0 +1,1276 @@ +/**************************************************************************** + * + * ftimage.h + * + * FreeType glyph image formats and default raster interface + * (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * Note: A 'raster' is simply a scan-line converter, used to render + * FT_Outlines into FT_Bitmaps. + * + */ + + +#ifndef FTIMAGE_H_ +#define FTIMAGE_H_ + + + /* STANDALONE_ is from ftgrays.c */ +#ifndef STANDALONE_ +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @type: + * FT_Pos + * + * @description: + * The type FT_Pos is used to store vectorial coordinates. Depending on + * the context, these can represent distances in integer font units, or + * 16.16, or 26.6 fixed-point pixel coordinates. + */ + typedef signed long FT_Pos; + + + /************************************************************************** + * + * @struct: + * FT_Vector + * + * @description: + * A simple structure used to store a 2D vector; coordinates are of the + * FT_Pos type. + * + * @fields: + * x :: + * The horizontal coordinate. + * y :: + * The vertical coordinate. + */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /************************************************************************** + * + * @struct: + * FT_BBox + * + * @description: + * A structure used to hold an outline's bounding box, i.e., the + * coordinates of its extrema in the horizontal and vertical directions. + * + * @fields: + * xMin :: + * The horizontal minimum (left-most). + * + * yMin :: + * The vertical minimum (bottom-most). + * + * xMax :: + * The horizontal maximum (right-most). + * + * yMax :: + * The vertical maximum (top-most). + * + * @note: + * The bounding box is specified with the coordinates of the lower left + * and the upper right corner. In PostScript, those values are often + * called (llx,lly) and (urx,ury), respectively. + * + * If `yMin` is negative, this value gives the glyph's descender. + * Otherwise, the glyph doesn't descend below the baseline. Similarly, + * if `ymax` is positive, this value gives the glyph's ascender. + * + * `xMin` gives the horizontal distance from the glyph's origin to the + * left edge of the glyph's bounding box. If `xMin` is negative, the + * glyph extends to the left of the origin. + */ + typedef struct FT_BBox_ + { + FT_Pos xMin, yMin; + FT_Pos xMax, yMax; + + } FT_BBox; + + + /************************************************************************** + * + * @enum: + * FT_Pixel_Mode + * + * @description: + * An enumeration type used to describe the format of pixels in a given + * bitmap. Note that additional formats may be added in the future. + * + * @values: + * FT_PIXEL_MODE_NONE :: + * Value~0 is reserved. + * + * FT_PIXEL_MODE_MONO :: + * A monochrome bitmap, using 1~bit per pixel. Note that pixels are + * stored in most-significant order (MSB), which means that the + * left-most pixel in a byte has value 128. + * + * FT_PIXEL_MODE_GRAY :: + * An 8-bit bitmap, generally used to represent anti-aliased glyph + * images. Each pixel is stored in one byte. Note that the number of + * 'gray' levels is stored in the `num_grays` field of the @FT_Bitmap + * structure (it generally is 256). + * + * FT_PIXEL_MODE_GRAY2 :: + * A 2-bit per pixel bitmap, used to represent embedded anti-aliased + * bitmaps in font files according to the OpenType specification. We + * haven't found a single font using this format, however. + * + * FT_PIXEL_MODE_GRAY4 :: + * A 4-bit per pixel bitmap, representing embedded anti-aliased bitmaps + * in font files according to the OpenType specification. We haven't + * found a single font using this format, however. + * + * FT_PIXEL_MODE_LCD :: + * An 8-bit bitmap, representing RGB or BGR decimated glyph images used + * for display on LCD displays; the bitmap is three times wider than + * the original glyph image. See also @FT_RENDER_MODE_LCD. + * + * FT_PIXEL_MODE_LCD_V :: + * An 8-bit bitmap, representing RGB or BGR decimated glyph images used + * for display on rotated LCD displays; the bitmap is three times + * taller than the original glyph image. See also + * @FT_RENDER_MODE_LCD_V. + * + * FT_PIXEL_MODE_BGRA :: + * [Since 2.5] An image with four 8-bit channels per pixel, + * representing a color image (such as emoticons) with alpha channel. + * For each pixel, the format is BGRA, which means, the blue channel + * comes first in memory. The color channels are pre-multiplied and in + * the sRGB colorspace. For example, full red at half-translucent + * opacity will be represented as '00,00,80,80', not '00,00,FF,80'. + * See also @FT_LOAD_COLOR. + */ + typedef enum FT_Pixel_Mode_ + { + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO, + FT_PIXEL_MODE_GRAY, + FT_PIXEL_MODE_GRAY2, + FT_PIXEL_MODE_GRAY4, + FT_PIXEL_MODE_LCD, + FT_PIXEL_MODE_LCD_V, + FT_PIXEL_MODE_BGRA, + + FT_PIXEL_MODE_MAX /* do not remove */ + + } FT_Pixel_Mode; + + + /* these constants are deprecated; use the corresponding `FT_Pixel_Mode` */ + /* values instead. */ +#define ft_pixel_mode_none FT_PIXEL_MODE_NONE +#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO +#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY +#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 +#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 + + /* */ + + /* For debugging, the @FT_Pixel_Mode enumeration must stay in sync */ + /* with the `pixel_modes` array in file `ftobjs.c`. */ + + + /************************************************************************** + * + * @struct: + * FT_Bitmap + * + * @description: + * A structure used to describe a bitmap or pixmap to the raster. Note + * that we now manage pixmaps of various depths through the `pixel_mode` + * field. + * + * @fields: + * rows :: + * The number of bitmap rows. + * + * width :: + * The number of pixels in bitmap row. + * + * pitch :: + * The pitch's absolute value is the number of bytes taken by one + * bitmap row, including padding. However, the pitch is positive when + * the bitmap has a 'down' flow, and negative when it has an 'up' flow. + * In all cases, the pitch is an offset to add to a bitmap pointer in + * order to go down one row. + * + * Note that 'padding' means the alignment of a bitmap to a byte + * border, and FreeType functions normally align to the smallest + * possible integer value. + * + * For the B/W rasterizer, `pitch` is always an even number. + * + * To change the pitch of a bitmap (say, to make it a multiple of 4), + * use @FT_Bitmap_Convert. Alternatively, you might use callback + * functions to directly render to the application's surface; see the + * file `example2.cpp` in the tutorial for a demonstration. + * + * buffer :: + * A typeless pointer to the bitmap buffer. This value should be + * aligned on 32-bit boundaries in most cases. + * + * num_grays :: + * This field is only used with @FT_PIXEL_MODE_GRAY; it gives the + * number of gray levels used in the bitmap. + * + * pixel_mode :: + * The pixel mode, i.e., how pixel bits are stored. See @FT_Pixel_Mode + * for possible values. + * + * palette_mode :: + * This field is intended for paletted pixel modes; it indicates how + * the palette is stored. Not used currently. + * + * palette :: + * A typeless pointer to the bitmap palette; this field is intended for + * paletted pixel modes. Not used currently. + */ + typedef struct FT_Bitmap_ + { + unsigned int rows; + unsigned int width; + int pitch; + unsigned char* buffer; + unsigned short num_grays; + unsigned char pixel_mode; + unsigned char palette_mode; + void* palette; + + } FT_Bitmap; + + + /************************************************************************** + * + * @section: + * outline_processing + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Outline + * + * @description: + * This structure is used to describe an outline to the scan-line + * converter. + * + * @fields: + * n_contours :: + * The number of contours in the outline. + * + * n_points :: + * The number of points in the outline. + * + * points :: + * A pointer to an array of `n_points` @FT_Vector elements, giving the + * outline's point coordinates. + * + * tags :: + * A pointer to an array of `n_points` chars, giving each outline + * point's type. + * + * If bit~0 is unset, the point is 'off' the curve, i.e., a Bezier + * control point, while it is 'on' if set. + * + * Bit~1 is meaningful for 'off' points only. If set, it indicates a + * third-order Bezier arc control point; and a second-order control + * point if unset. + * + * If bit~2 is set, bits 5-7 contain the drop-out mode (as defined in + * the OpenType specification; the value is the same as the argument to + * the 'SCANMODE' instruction). + * + * Bits 3 and~4 are reserved for internal purposes. + * + * contours :: + * An array of `n_contours` shorts, giving the end point of each + * contour within the outline. For example, the first contour is + * defined by the points '0' to `contours[0]`, the second one is + * defined by the points `contours[0]+1` to `contours[1]`, etc. + * + * flags :: + * A set of bit flags used to characterize the outline and give hints + * to the scan-converter and hinter on how to convert/grid-fit it. See + * @FT_OUTLINE_XXX. + * + * @note: + * The B/W rasterizer only checks bit~2 in the `tags` array for the first + * point of each contour. The drop-out mode as given with + * @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and + * @FT_OUTLINE_INCLUDE_STUBS in `flags` is then overridden. + */ + typedef struct FT_Outline_ + { + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + + } FT_Outline; + + /* */ + + /* Following limits must be consistent with */ + /* FT_Outline.{n_contours,n_points} */ +#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX +#define FT_OUTLINE_POINTS_MAX SHRT_MAX + + + /************************************************************************** + * + * @enum: + * FT_OUTLINE_XXX + * + * @description: + * A list of bit-field constants used for the flags in an outline's + * `flags` field. + * + * @values: + * FT_OUTLINE_NONE :: + * Value~0 is reserved. + * + * FT_OUTLINE_OWNER :: + * If set, this flag indicates that the outline's field arrays (i.e., + * `points`, `flags`, and `contours`) are 'owned' by the outline + * object, and should thus be freed when it is destroyed. + * + * FT_OUTLINE_EVEN_ODD_FILL :: + * By default, outlines are filled using the non-zero winding rule. If + * set to 1, the outline will be filled using the even-odd fill rule + * (only works with the smooth rasterizer). + * + * FT_OUTLINE_REVERSE_FILL :: + * By default, outside contours of an outline are oriented in + * clock-wise direction, as defined in the TrueType specification. + * This flag is set if the outline uses the opposite direction + * (typically for Type~1 fonts). This flag is ignored by the scan + * converter. + * + * FT_OUTLINE_IGNORE_DROPOUTS :: + * By default, the scan converter will try to detect drop-outs in an + * outline and correct the glyph bitmap to ensure consistent shape + * continuity. If set, this flag hints the scan-line converter to + * ignore such cases. See below for more information. + * + * FT_OUTLINE_SMART_DROPOUTS :: + * Select smart dropout control. If unset, use simple dropout control. + * Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more + * information. + * + * FT_OUTLINE_INCLUDE_STUBS :: + * If set, turn pixels on for 'stubs', otherwise exclude them. Ignored + * if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more + * information. + * + * FT_OUTLINE_OVERLAP :: + * This flag indicates that this outline contains overlapping contrours + * and the anti-aliased renderer should perform oversampling to + * mitigate possible artifacts. This flag should _not_ be set for + * well designed glyphs without overlaps because it quadruples the + * rendering time. + * + * FT_OUTLINE_HIGH_PRECISION :: + * This flag indicates that the scan-line converter should try to + * convert this outline to bitmaps with the highest possible quality. + * It is typically set for small character sizes. Note that this is + * only a hint that might be completely ignored by a given + * scan-converter. + * + * FT_OUTLINE_SINGLE_PASS :: + * This flag is set to force a given scan-converter to only use a + * single pass over the outline to render a bitmap glyph image. + * Normally, it is set for very large character sizes. It is only a + * hint that might be completely ignored by a given scan-converter. + * + * @note: + * The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and + * @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth rasterizer. + * + * There exists a second mechanism to pass the drop-out mode to the B/W + * rasterizer; see the `tags` field in @FT_Outline. + * + * Please refer to the description of the 'SCANTYPE' instruction in the + * OpenType specification (in file `ttinst1.doc`) how simple drop-outs, + * smart drop-outs, and stubs are defined. + */ +#define FT_OUTLINE_NONE 0x0 +#define FT_OUTLINE_OWNER 0x1 +#define FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define FT_OUTLINE_REVERSE_FILL 0x4 +#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 +#define FT_OUTLINE_SMART_DROPOUTS 0x10 +#define FT_OUTLINE_INCLUDE_STUBS 0x20 +#define FT_OUTLINE_OVERLAP 0x40 + +#define FT_OUTLINE_HIGH_PRECISION 0x100 +#define FT_OUTLINE_SINGLE_PASS 0x200 + + + /* these constants are deprecated; use the corresponding */ + /* `FT_OUTLINE_XXX` values instead */ +#define ft_outline_none FT_OUTLINE_NONE +#define ft_outline_owner FT_OUTLINE_OWNER +#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL +#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL +#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS +#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION +#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS + + /* */ + +#define FT_CURVE_TAG( flag ) ( flag & 0x03 ) + + /* see the `tags` field in `FT_Outline` for a description of the values */ +#define FT_CURVE_TAG_ON 0x01 +#define FT_CURVE_TAG_CONIC 0x00 +#define FT_CURVE_TAG_CUBIC 0x02 + +#define FT_CURVE_TAG_HAS_SCANMODE 0x04 + +#define FT_CURVE_TAG_TOUCH_X 0x08 /* reserved for TrueType hinter */ +#define FT_CURVE_TAG_TOUCH_Y 0x10 /* reserved for TrueType hinter */ + +#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ + FT_CURVE_TAG_TOUCH_Y ) + /* values 0x20, 0x40, and 0x80 are reserved */ + + + /* these constants are deprecated; use the corresponding */ + /* `FT_CURVE_TAG_XXX` values instead */ +#define FT_Curve_Tag_On FT_CURVE_TAG_ON +#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC +#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC +#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X +#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y + + + /************************************************************************** + * + * @functype: + * FT_Outline_MoveToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'move to' + * function during outline walking/decomposition. + * + * A 'move to' is emitted to start a new contour in an outline. + * + * @input: + * to :: + * A pointer to the target point of the 'move to'. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_MoveToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_LineToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'line to' + * function during outline walking/decomposition. + * + * A 'line to' is emitted to indicate a segment in the outline. + * + * @input: + * to :: + * A pointer to the target point of the 'line to'. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_LineToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_LineTo_Func FT_Outline_LineToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_ConicToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'conic to' + * function during outline walking or decomposition. + * + * A 'conic to' is emitted to indicate a second-order Bezier arc in the + * outline. + * + * @input: + * control :: + * An intermediate control point between the last position and the new + * target in `to`. + * + * to :: + * A pointer to the target end point of the conic arc. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_ConicToFunc)( const FT_Vector* control, + const FT_Vector* to, + void* user ); + +#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_CubicToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'cubic to' + * function during outline walking or decomposition. + * + * A 'cubic to' is emitted to indicate a third-order Bezier arc. + * + * @input: + * control1 :: + * A pointer to the first Bezier control point. + * + * control2 :: + * A pointer to the second Bezier control point. + * + * to :: + * A pointer to the target end point. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_CubicToFunc)( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user ); + +#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc + + + /************************************************************************** + * + * @struct: + * FT_Outline_Funcs + * + * @description: + * A structure to hold various function pointers used during outline + * decomposition in order to emit segments, conic, and cubic Beziers. + * + * @fields: + * move_to :: + * The 'move to' emitter. + * + * line_to :: + * The segment emitter. + * + * conic_to :: + * The second-order Bezier arc emitter. + * + * cubic_to :: + * The third-order Bezier arc emitter. + * + * shift :: + * The shift that is applied to coordinates before they are sent to the + * emitter. + * + * delta :: + * The delta that is applied to coordinates before they are sent to the + * emitter, but after the shift. + * + * @note: + * The point coordinates sent to the emitters are the transformed version + * of the original coordinates (this is important for high accuracy + * during scan-conversion). The transformation is simple: + * + * ``` + * x' = (x << shift) - delta + * y' = (y << shift) - delta + * ``` + * + * Set the values of `shift` and `delta` to~0 to get the original point + * coordinates. + */ + typedef struct FT_Outline_Funcs_ + { + FT_Outline_MoveToFunc move_to; + FT_Outline_LineToFunc line_to; + FT_Outline_ConicToFunc conic_to; + FT_Outline_CubicToFunc cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @macro: + * FT_IMAGE_TAG + * + * @description: + * This macro converts four-letter tags to an unsigned long type. + * + * @note: + * Since many 16-bit compilers don't like 32-bit enumerations, you should + * redefine this macro in case of problems to something like this: + * + * ``` + * #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value + * ``` + * + * to get a simple enumeration without assigning special numbers. + */ +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ + value = ( ( (unsigned long)_x1 << 24 ) | \ + ( (unsigned long)_x2 << 16 ) | \ + ( (unsigned long)_x3 << 8 ) | \ + (unsigned long)_x4 ) +#endif /* FT_IMAGE_TAG */ + + + /************************************************************************** + * + * @enum: + * FT_Glyph_Format + * + * @description: + * An enumeration type used to describe the format of a given glyph + * image. Note that this version of FreeType only supports two image + * formats, even though future font drivers will be able to register + * their own format. + * + * @values: + * FT_GLYPH_FORMAT_NONE :: + * The value~0 is reserved. + * + * FT_GLYPH_FORMAT_COMPOSITE :: + * The glyph image is a composite of several other images. This format + * is _only_ used with @FT_LOAD_NO_RECURSE, and is used to report + * compound glyphs (like accented characters). + * + * FT_GLYPH_FORMAT_BITMAP :: + * The glyph image is a bitmap, and can be described as an @FT_Bitmap. + * You generally need to access the `bitmap` field of the + * @FT_GlyphSlotRec structure to read it. + * + * FT_GLYPH_FORMAT_OUTLINE :: + * The glyph image is a vectorial outline made of line segments and + * Bezier arcs; it can be described as an @FT_Outline; you generally + * want to access the `outline` field of the @FT_GlyphSlotRec structure + * to read it. + * + * FT_GLYPH_FORMAT_PLOTTER :: + * The glyph image is a vectorial path with no inside and outside + * contours. Some Type~1 fonts, like those in the Hershey family, + * contain glyphs in this format. These are described as @FT_Outline, + * but FreeType isn't currently capable of rendering them correctly. + */ + typedef enum FT_Glyph_Format_ + { + FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), + + FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) + + } FT_Glyph_Format; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Glyph_Format` values instead. */ +#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE +#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE +#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP +#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE +#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** R A S T E R D E F I N I T I O N S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + + /************************************************************************** + * + * @section: + * raster + * + * @title: + * Scanline Converter + * + * @abstract: + * How vectorial outlines are converted into bitmaps and pixmaps. + * + * @description: + * A raster or a rasterizer is a scan converter in charge of producing a + * pixel coverage bitmap that can be used as an alpha channel when + * compositing a glyph with a background. FreeType comes with two + * rasterizers: bilevel `raster1` and anti-aliased `smooth` are two + * separate modules. They are usually called from the high-level + * @FT_Load_Glyph or @FT_Render_Glyph functions and produce the entire + * coverage bitmap at once, while staying largely invisible to users. + * + * Instead of working with complete coverage bitmaps, it is also possible + * to intercept consecutive pixel runs on the same scanline with the same + * coverage, called _spans_, and process them individually. Only the + * `smooth` rasterizer permits this when calling @FT_Outline_Render with + * @FT_Raster_Params as described below. + * + * Working with either complete bitmaps or spans it is important to think + * of them as colorless coverage objects suitable as alpha channels to + * blend arbitrary colors with a background. For best results, it is + * recommended to use gamma correction, too. + * + * This section also describes the public API needed to set up alternative + * @FT_Renderer modules. + * + * @order: + * FT_Span + * FT_SpanFunc + * FT_Raster_Params + * FT_RASTER_FLAG_XXX + * + * FT_Raster + * FT_Raster_NewFunc + * FT_Raster_DoneFunc + * FT_Raster_ResetFunc + * FT_Raster_SetModeFunc + * FT_Raster_RenderFunc + * FT_Raster_Funcs + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Span + * + * @description: + * A structure to model a single span of consecutive pixels when + * rendering an anti-aliased bitmap. + * + * @fields: + * x :: + * The span's horizontal start position. + * + * len :: + * The span's length in pixels. + * + * coverage :: + * The span color/coverage, ranging from 0 (background) to 255 + * (foreground). + * + * @note: + * This structure is used by the span drawing callback type named + * @FT_SpanFunc that takes the y~coordinate of the span as a parameter. + * + * The anti-aliased rasterizer produces coverage values from 0 to 255, + * this is, from completely transparent to completely opaque. + */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /************************************************************************** + * + * @functype: + * FT_SpanFunc + * + * @description: + * A function used as a call-back by the anti-aliased renderer in order + * to let client applications draw themselves the pixel spans on each + * scan line. + * + * @input: + * y :: + * The scanline's upward y~coordinate. + * + * count :: + * The number of spans to draw on this scanline. + * + * spans :: + * A table of `count` spans to draw on the scanline. + * + * user :: + * User-supplied data that is passed to the callback. + * + * @note: + * This callback allows client applications to directly render the spans + * of the anti-aliased bitmap to any kind of surfaces. + * + * This can be used to write anti-aliased outlines directly to a given + * background bitmap using alpha compositing. It can also be used for + * oversampling and averaging. + */ + typedef void + (*FT_SpanFunc)( int y, + int count, + const FT_Span* spans, + void* user ); + +#define FT_Raster_Span_Func FT_SpanFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_BitTest_Func + * + * @description: + * Deprecated, unimplemented. + */ + typedef int + (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /************************************************************************** + * + * @functype: + * FT_Raster_BitSet_Func + * + * @description: + * Deprecated, unimplemented. + */ + typedef void + (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /************************************************************************** + * + * @enum: + * FT_RASTER_FLAG_XXX + * + * @description: + * A list of bit flag constants as used in the `flags` field of a + * @FT_Raster_Params structure. + * + * @values: + * FT_RASTER_FLAG_DEFAULT :: + * This value is 0. + * + * FT_RASTER_FLAG_AA :: + * This flag is set to indicate that an anti-aliased glyph image should + * be generated. Otherwise, it will be monochrome (1-bit). + * + * FT_RASTER_FLAG_DIRECT :: + * This flag is set to indicate direct rendering. In this mode, client + * applications must provide their own span callback. This lets them + * directly draw or compose over an existing bitmap. If this bit is + * _not_ set, the target pixmap's buffer _must_ be zeroed before + * rendering and the output will be clipped to its size. + * + * Direct rendering is only possible with anti-aliased glyphs. + * + * FT_RASTER_FLAG_CLIP :: + * This flag is only used in direct rendering mode. If set, the output + * will be clipped to a box specified in the `clip_box` field of the + * @FT_Raster_Params structure. Otherwise, the `clip_box` is + * effectively set to the bounding box and all spans are generated. + * + * FT_RASTER_FLAG_SDF :: + * This flag is set to indicate that a signed distance field glyph + * image should be generated. This is only used while rendering with + * the @FT_RENDER_MODE_SDF render mode. + */ +#define FT_RASTER_FLAG_DEFAULT 0x0 +#define FT_RASTER_FLAG_AA 0x1 +#define FT_RASTER_FLAG_DIRECT 0x2 +#define FT_RASTER_FLAG_CLIP 0x4 +#define FT_RASTER_FLAG_SDF 0x8 + + /* these constants are deprecated; use the corresponding */ + /* `FT_RASTER_FLAG_XXX` values instead */ +#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa FT_RASTER_FLAG_AA +#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP + + + /************************************************************************** + * + * @struct: + * FT_Raster_Params + * + * @description: + * A structure to hold the parameters used by a raster's render function, + * passed as an argument to @FT_Outline_Render. + * + * @fields: + * target :: + * The target bitmap. + * + * source :: + * A pointer to the source glyph image (e.g., an @FT_Outline). + * + * flags :: + * The rendering flags. + * + * gray_spans :: + * The gray span drawing callback. + * + * black_spans :: + * Unused. + * + * bit_test :: + * Unused. + * + * bit_set :: + * Unused. + * + * user :: + * User-supplied data that is passed to each drawing callback. + * + * clip_box :: + * An optional span clipping box expressed in _integer_ pixels + * (not in 26.6 fixed-point units). + * + * @note: + * The @FT_RASTER_FLAG_AA bit flag must be set in the `flags` to + * generate an anti-aliased glyph bitmap, otherwise a monochrome bitmap + * is generated. The `target` should have appropriate pixel mode and its + * dimensions define the clipping region. + * + * If both @FT_RASTER_FLAG_AA and @FT_RASTER_FLAG_DIRECT bit flags + * are set in `flags`, the raster calls an @FT_SpanFunc callback + * `gray_spans` with `user` data as an argument ignoring `target`. This + * allows direct composition over a pre-existing user surface to perform + * the span drawing and composition. To optionally clip the spans, set + * the @FT_RASTER_FLAG_CLIP flag and `clip_box`. The monochrome raster + * does not support the direct mode. + * + * The gray-level rasterizer always uses 256 gray levels. If you want + * fewer gray levels, you have to use @FT_RASTER_FLAG_DIRECT and reduce + * the levels in the callback function. + */ + typedef struct FT_Raster_Params_ + { + const FT_Bitmap* target; + const void* source; + int flags; + FT_SpanFunc gray_spans; + FT_SpanFunc black_spans; /* unused */ + FT_Raster_BitTest_Func bit_test; /* unused */ + FT_Raster_BitSet_Func bit_set; /* unused */ + void* user; + FT_BBox clip_box; + + } FT_Raster_Params; + + + /************************************************************************** + * + * @type: + * FT_Raster + * + * @description: + * An opaque handle (pointer) to a raster object. Each object can be + * used independently to convert an outline into a bitmap or pixmap. + * + * @note: + * In FreeType 2, all rasters are now encapsulated within specific + * @FT_Renderer modules and only used in their context. + * + */ + typedef struct FT_RasterRec_* FT_Raster; + + + /************************************************************************** + * + * @functype: + * FT_Raster_NewFunc + * + * @description: + * A function used to create a new raster object. + * + * @input: + * memory :: + * A handle to the memory allocator. + * + * @output: + * raster :: + * A handle to the new raster object. + * + * @return: + * Error code. 0~means success. + * + * @note: + * The `memory` parameter is a typeless pointer in order to avoid + * un-wanted dependencies on the rest of the FreeType code. In practice, + * it is an @FT_Memory object, i.e., a handle to the standard FreeType + * memory allocator. However, this field can be completely ignored by a + * given raster implementation. + */ + typedef int + (*FT_Raster_NewFunc)( void* memory, + FT_Raster* raster ); + +#define FT_Raster_New_Func FT_Raster_NewFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_DoneFunc + * + * @description: + * A function used to destroy a given raster object. + * + * @input: + * raster :: + * A handle to the raster object. + */ + typedef void + (*FT_Raster_DoneFunc)( FT_Raster raster ); + +#define FT_Raster_Done_Func FT_Raster_DoneFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_ResetFunc + * + * @description: + * FreeType used to provide an area of memory called the 'render pool' + * available to all registered rasterizers. This was not thread safe, + * however, and now FreeType never allocates this pool. + * + * This function is called after a new raster object is created. + * + * @input: + * raster :: + * A handle to the new raster object. + * + * pool_base :: + * Previously, the address in memory of the render pool. Set this to + * `NULL`. + * + * pool_size :: + * Previously, the size in bytes of the render pool. Set this to 0. + * + * @note: + * Rasterizers should rely on dynamic or stack allocation if they want to + * (a handle to the memory allocator is passed to the rasterizer + * constructor). + */ + typedef void + (*FT_Raster_ResetFunc)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define FT_Raster_Reset_Func FT_Raster_ResetFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_SetModeFunc + * + * @description: + * This function is a generic facility to change modes or attributes in a + * given raster. This can be used for debugging purposes, or simply to + * allow implementation-specific 'features' in a given raster module. + * + * @input: + * raster :: + * A handle to the new raster object. + * + * mode :: + * A 4-byte tag used to name the mode or property. + * + * args :: + * A pointer to the new mode/property to use. + */ + typedef int + (*FT_Raster_SetModeFunc)( FT_Raster raster, + unsigned long mode, + void* args ); + +#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_RenderFunc + * + * @description: + * Invoke a given raster to scan-convert a given glyph image into a + * target bitmap. + * + * @input: + * raster :: + * A handle to the raster object. + * + * params :: + * A pointer to an @FT_Raster_Params structure used to store the + * rendering parameters. + * + * @return: + * Error code. 0~means success. + * + * @note: + * The exact format of the source image depends on the raster's glyph + * format defined in its @FT_Raster_Funcs structure. It can be an + * @FT_Outline or anything else in order to support a large array of + * glyph formats. + * + * Note also that the render function can fail and return a + * `FT_Err_Unimplemented_Feature` error code if the raster used does not + * support direct composition. + */ + typedef int + (*FT_Raster_RenderFunc)( FT_Raster raster, + const FT_Raster_Params* params ); + +#define FT_Raster_Render_Func FT_Raster_RenderFunc + + + /************************************************************************** + * + * @struct: + * FT_Raster_Funcs + * + * @description: + * A structure used to describe a given raster class to the library. + * + * @fields: + * glyph_format :: + * The supported glyph format for this raster. + * + * raster_new :: + * The raster constructor. + * + * raster_reset :: + * Used to reset the render pool within the raster. + * + * raster_render :: + * A function to render a glyph into a given bitmap. + * + * raster_done :: + * The raster destructor. + */ + typedef struct FT_Raster_Funcs_ + { + FT_Glyph_Format glyph_format; + + FT_Raster_NewFunc raster_new; + FT_Raster_ResetFunc raster_reset; + FT_Raster_SetModeFunc raster_set_mode; + FT_Raster_RenderFunc raster_render; + FT_Raster_DoneFunc raster_done; + + } FT_Raster_Funcs; + + /* */ + + +FT_END_HEADER + +#endif /* FTIMAGE_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/NothinFancy/dep/include/freetype/ftincrem.h b/NothinFancy/dep/include/freetype/ftincrem.h new file mode 100644 index 0000000..229b947 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftincrem.h @@ -0,0 +1,348 @@ +/**************************************************************************** + * + * ftincrem.h + * + * FreeType incremental loading (specification). + * + * Copyright (C) 2002-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTINCREM_H_ +#define FTINCREM_H_ + +#include +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * incremental + * + * @title: + * Incremental Loading + * + * @abstract: + * Custom Glyph Loading. + * + * @description: + * This section contains various functions used to perform so-called + * 'incremental' glyph loading. This is a mode where all glyphs loaded + * from a given @FT_Face are provided by the client application. + * + * Apart from that, all other tables are loaded normally from the font + * file. This mode is useful when FreeType is used within another + * engine, e.g., a PostScript Imaging Processor. + * + * To enable this mode, you must use @FT_Open_Face, passing an + * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an + * @FT_Incremental_Interface value. See the comments for + * @FT_Incremental_InterfaceRec for an example. + * + */ + + + /************************************************************************** + * + * @type: + * FT_Incremental + * + * @description: + * An opaque type describing a user-provided object used to implement + * 'incremental' glyph loading within FreeType. This is used to support + * embedded fonts in certain environments (e.g., PostScript + * interpreters), where the glyph data isn't in the font file, or must be + * overridden by different values. + * + * @note: + * It is up to client applications to create and implement + * @FT_Incremental objects, as long as they provide implementations for + * the methods @FT_Incremental_GetGlyphDataFunc, + * @FT_Incremental_FreeGlyphDataFunc and + * @FT_Incremental_GetGlyphMetricsFunc. + * + * See the description of @FT_Incremental_InterfaceRec to understand how + * to use incremental objects with FreeType. + * + */ + typedef struct FT_IncrementalRec_* FT_Incremental; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_MetricsRec + * + * @description: + * A small structure used to contain the basic glyph metrics returned by + * the @FT_Incremental_GetGlyphMetricsFunc method. + * + * @fields: + * bearing_x :: + * Left bearing, in font units. + * + * bearing_y :: + * Top bearing, in font units. + * + * advance :: + * Horizontal component of glyph advance, in font units. + * + * advance_v :: + * Vertical component of glyph advance, in font units. + * + * @note: + * These correspond to horizontal or vertical metrics depending on the + * value of the `vertical` argument to the function + * @FT_Incremental_GetGlyphMetricsFunc. + * + */ + typedef struct FT_Incremental_MetricsRec_ + { + FT_Long bearing_x; + FT_Long bearing_y; + FT_Long advance; + FT_Long advance_v; /* since 2.3.12 */ + + } FT_Incremental_MetricsRec; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_Metrics + * + * @description: + * A handle to an @FT_Incremental_MetricsRec structure. + * + */ + typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; + + + /************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphDataFunc + * + * @description: + * A function called by FreeType to access a given glyph's data bytes + * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is + * enabled. + * + * Note that the format of the glyph's data bytes depends on the font + * file format. For TrueType, it must correspond to the raw bytes within + * the 'glyf' table. For PostScript formats, it must correspond to the + * **unencrypted** charstring bytes, without any `lenIV` header. It is + * undefined for any other format. + * + * @input: + * incremental :: + * Handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * @output: + * adata :: + * A structure describing the returned glyph data bytes (which will be + * accessed as a read-only byte block). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function returns successfully the method + * @FT_Incremental_FreeGlyphDataFunc will be called later to release the + * data bytes. + * + * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for + * compound glyphs. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Data* adata ); + + + /************************************************************************** + * + * @type: + * FT_Incremental_FreeGlyphDataFunc + * + * @description: + * A function used to release the glyph data bytes returned by a + * successful call to @FT_Incremental_GetGlyphDataFunc. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * data :: + * A structure describing the glyph data bytes (which will be accessed + * as a read-only byte block). + * + */ + typedef void + (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, + FT_Data* data ); + + + /************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphMetricsFunc + * + * @description: + * A function used to retrieve the basic metrics of a given glyph index + * before accessing its data. This allows for handling font types such + * as PCL~XL Format~1, Class~2 downloaded TrueType fonts, where the glyph + * metrics (`hmtx` and `vmtx` tables) are permitted to be omitted from + * the font, and the relevant metrics included in the header of the glyph + * outline data. Importantly, this is not intended to allow custom glyph + * metrics (for example, Postscript Metrics dictionaries), because that + * conflicts with the requirements of outline hinting. Such custom + * metrics must be handled separately, by the calling application. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * vertical :: + * If true, return vertical metrics. + * + * ametrics :: + * This parameter is used for both input and output. The original + * glyph metrics, if any, in font units. If metrics are not available + * all the values must be set to zero. + * + * @output: + * ametrics :: + * The glyph metrics in font units. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphMetricsFunc) + ( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Bool vertical, + FT_Incremental_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @struct: + * FT_Incremental_FuncsRec + * + * @description: + * A table of functions for accessing fonts that load data incrementally. + * Used in @FT_Incremental_InterfaceRec. + * + * @fields: + * get_glyph_data :: + * The function to get glyph data. Must not be null. + * + * free_glyph_data :: + * The function to release glyph data. Must not be null. + * + * get_glyph_metrics :: + * The function to get glyph metrics. May be null if the font does not + * require it. + * + */ + typedef struct FT_Incremental_FuncsRec_ + { + FT_Incremental_GetGlyphDataFunc get_glyph_data; + FT_Incremental_FreeGlyphDataFunc free_glyph_data; + FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; + + } FT_Incremental_FuncsRec; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_InterfaceRec + * + * @description: + * A structure to be used with @FT_Open_Face to indicate that the user + * wants to support incremental glyph loading. You should use it with + * @FT_PARAM_TAG_INCREMENTAL as in the following example: + * + * ``` + * FT_Incremental_InterfaceRec inc_int; + * FT_Parameter parameter; + * FT_Open_Args open_args; + * + * + * // set up incremental descriptor + * inc_int.funcs = my_funcs; + * inc_int.object = my_object; + * + * // set up optional parameter + * parameter.tag = FT_PARAM_TAG_INCREMENTAL; + * parameter.data = &inc_int; + * + * // set up FT_Open_Args structure + * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; + * open_args.pathname = my_font_pathname; + * open_args.num_params = 1; + * open_args.params = ¶meter; // we use one optional argument + * + * // open the font + * error = FT_Open_Face( library, &open_args, index, &face ); + * ... + * ``` + * + */ + typedef struct FT_Incremental_InterfaceRec_ + { + const FT_Incremental_FuncsRec* funcs; + FT_Incremental object; + + } FT_Incremental_InterfaceRec; + + + /************************************************************************** + * + * @type: + * FT_Incremental_Interface + * + * @description: + * A pointer to an @FT_Incremental_InterfaceRec structure. + * + */ + typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; + + + /* */ + + +FT_END_HEADER + +#endif /* FTINCREM_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftlcdfil.h b/NothinFancy/dep/include/freetype/ftlcdfil.h new file mode 100644 index 0000000..107a174 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftlcdfil.h @@ -0,0 +1,323 @@ +/**************************************************************************** + * + * ftlcdfil.h + * + * FreeType API for color filtering of subpixel bitmap glyphs + * (specification). + * + * Copyright (C) 2006-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTLCDFIL_H_ +#define FTLCDFIL_H_ + +#include +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * lcd_rendering + * + * @title: + * Subpixel Rendering + * + * @abstract: + * API to control subpixel rendering. + * + * @description: + * FreeType provides two alternative subpixel rendering technologies. + * Should you define `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` in your + * `ftoption.h` file, this enables ClearType-style rendering. + * Otherwise, Harmony LCD rendering is enabled. These technologies are + * controlled differently and API described below, although always + * available, performs its function when appropriate method is enabled + * and does nothing otherwise. + * + * ClearType-style LCD rendering exploits the color-striped structure of + * LCD pixels, increasing the available resolution in the direction of + * the stripe (usually horizontal RGB) by a factor of~3. Using the + * subpixel coverages unfiltered can create severe color fringes + * especially when rendering thin features. Indeed, to produce + * black-on-white text, the nearby color subpixels must be dimmed + * evenly. Therefore, an equalizing 5-tap FIR filter should be applied + * to subpixel coverages regardless of pixel boundaries and should have + * these properties: + * + * 1. It should be symmetrical, like {~a, b, c, b, a~}, to avoid + * any shifts in appearance. + * + * 2. It should be color-balanced, meaning a~+ b~=~c, to reduce color + * fringes by distributing the computed coverage for one subpixel to + * all subpixels equally. + * + * 3. It should be normalized, meaning 2a~+ 2b~+ c~=~1.0 to maintain + * overall brightness. + * + * Boxy 3-tap filter {0, 1/3, 1/3, 1/3, 0} is sharper but is less + * forgiving of non-ideal gamma curves of a screen (and viewing angles), + * beveled filters are fuzzier but more tolerant. + * + * Use the @FT_Library_SetLcdFilter or @FT_Library_SetLcdFilterWeights + * API to specify a low-pass filter, which is then applied to + * subpixel-rendered bitmaps generated through @FT_Render_Glyph. + * + * Harmony LCD rendering is suitable to panels with any regular subpixel + * structure, not just monitors with 3 color striped subpixels, as long + * as the color subpixels have fixed positions relative to the pixel + * center. In this case, each color channel can be rendered separately + * after shifting the outline opposite to the subpixel shift so that the + * coverage maps are aligned. This method is immune to color fringes + * because the shifts do not change integral coverage. + * + * The subpixel geometry must be specified by xy-coordinates for each + * subpixel. By convention they may come in the RGB order: {{-1/3, 0}, + * {0, 0}, {1/3, 0}} for standard RGB striped panel or {{-1/6, 1/4}, + * {-1/6, -1/4}, {1/3, 0}} for a certain PenTile panel. + * + * Use the @FT_Library_SetLcdGeometry API to specify subpixel positions. + * If one follows the RGB order convention, the same order applies to the + * resulting @FT_PIXEL_MODE_LCD and @FT_PIXEL_MODE_LCD_V bitmaps. Note, + * however, that the coordinate frame for the latter must be rotated + * clockwise. Harmony with default LCD geometry is equivalent to + * ClearType with light filter. + * + * As a result of ClearType filtering or Harmony shifts, the resulting + * dimensions of LCD bitmaps can be slightly wider or taller than the + * dimensions the original outline with regard to the pixel grid. + * For example, for @FT_RENDER_MODE_LCD, the filter adds 2~subpixels to + * the left, and 2~subpixels to the right. The bitmap offset values are + * adjusted accordingly, so clients shouldn't need to modify their layout + * and glyph positioning code when enabling the filter. + * + * The ClearType and Harmony rendering is applicable to glyph bitmaps + * rendered through @FT_Render_Glyph, @FT_Load_Glyph, @FT_Load_Char, and + * @FT_Glyph_To_Bitmap, when @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V + * is specified. This API does not control @FT_Outline_Render and + * @FT_Outline_Get_Bitmap. + * + * The described algorithms can completely remove color artefacts when + * combined with gamma-corrected alpha blending in linear space. Each of + * the 3~alpha values (subpixels) must by independently used to blend one + * color channel. That is, red alpha blends the red channel of the text + * color with the red channel of the background pixel. + */ + + + /************************************************************************** + * + * @enum: + * FT_LcdFilter + * + * @description: + * A list of values to identify various types of LCD filters. + * + * @values: + * FT_LCD_FILTER_NONE :: + * Do not perform filtering. When used with subpixel rendering, this + * results in sometimes severe color fringes. + * + * FT_LCD_FILTER_DEFAULT :: + * This is a beveled, normalized, and color-balanced five-tap filter + * with weights of [0x08 0x4D 0x56 0x4D 0x08] in 1/256th units. + * + * FT_LCD_FILTER_LIGHT :: + * this is a boxy, normalized, and color-balanced three-tap filter with + * weights of [0x00 0x55 0x56 0x55 0x00] in 1/256th units. + * + * FT_LCD_FILTER_LEGACY :: + * FT_LCD_FILTER_LEGACY1 :: + * This filter corresponds to the original libXft color filter. It + * provides high contrast output but can exhibit really bad color + * fringes if glyphs are not extremely well hinted to the pixel grid. + * This filter is only provided for comparison purposes, and might be + * disabled or stay unsupported in the future. The second value is + * provided for compatibility with FontConfig, which historically used + * different enumeration, sometimes incorrectly forwarded to FreeType. + * + * @since: + * 2.3.0 (`FT_LCD_FILTER_LEGACY1` since 2.6.2) + */ + typedef enum FT_LcdFilter_ + { + FT_LCD_FILTER_NONE = 0, + FT_LCD_FILTER_DEFAULT = 1, + FT_LCD_FILTER_LIGHT = 2, + FT_LCD_FILTER_LEGACY1 = 3, + FT_LCD_FILTER_LEGACY = 16, + + FT_LCD_FILTER_MAX /* do not remove */ + + } FT_LcdFilter; + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdFilter + * + * @description: + * This function is used to change filter applied to LCD decimated + * bitmaps, like the ones used when calling @FT_Render_Glyph with + * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. + * + * @input: + * library :: + * A handle to the target library instance. + * + * filter :: + * The filter type. + * + * You can use @FT_LCD_FILTER_NONE here to disable this feature, or + * @FT_LCD_FILTER_DEFAULT to use a default filter that should work well + * on most LCD screens. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Since 2.10.3 the LCD filtering is enabled with @FT_LCD_FILTER_DEFAULT. + * It is no longer necessary to call this function explicitly except + * to choose a different filter or disable filtering altogether with + * @FT_LCD_FILTER_NONE. + * + * This function does nothing but returns `FT_Err_Unimplemented_Feature` + * if the configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is + * not defined in your build of the library. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ); + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdFilterWeights + * + * @description: + * This function can be used to enable LCD filter with custom weights, + * instead of using presets in @FT_Library_SetLcdFilter. + * + * @input: + * library :: + * A handle to the target library instance. + * + * weights :: + * A pointer to an array; the function copies the first five bytes and + * uses them to specify the filter weights in 1/256th units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does nothing but returns `FT_Err_Unimplemented_Feature` + * if the configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is + * not defined in your build of the library. + * + * LCD filter weights can also be set per face using @FT_Face_Properties + * with @FT_PARAM_TAG_LCD_FILTER_WEIGHTS. + * + * @since: + * 2.4.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ); + + + /************************************************************************** + * + * @type: + * FT_LcdFiveTapFilter + * + * @description: + * A typedef for passing the five LCD filter weights to + * @FT_Face_Properties within an @FT_Parameter structure. + * + * @since: + * 2.8 + * + */ +#define FT_LCD_FILTER_FIVE_TAPS 5 + + typedef FT_Byte FT_LcdFiveTapFilter[FT_LCD_FILTER_FIVE_TAPS]; + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdGeometry + * + * @description: + * This function can be used to modify default positions of color + * subpixels, which controls Harmony LCD rendering. + * + * @input: + * library :: + * A handle to the target library instance. + * + * sub :: + * A pointer to an array of 3 vectors in 26.6 fractional pixel format; + * the function modifies the default values, see the note below. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Subpixel geometry examples: + * + * - {{-21, 0}, {0, 0}, {21, 0}} is the default, corresponding to 3 color + * stripes shifted by a third of a pixel. This could be an RGB panel. + * + * - {{21, 0}, {0, 0}, {-21, 0}} looks the same as the default but can + * specify a BGR panel instead, while keeping the bitmap in the same + * RGB888 format. + * + * - {{0, 21}, {0, 0}, {0, -21}} is the vertical RGB, but the bitmap + * stays RGB888 as a result. + * + * - {{-11, 16}, {-11, -16}, {22, 0}} is a certain PenTile arrangement. + * + * This function does nothing and returns `FT_Err_Unimplemented_Feature` + * in the context of ClearType-style subpixel rendering when + * `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is defined in your build of the + * library. + * + * @since: + * 2.10.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdGeometry( FT_Library library, + FT_Vector sub[3] ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLCDFIL_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftlist.h b/NothinFancy/dep/include/freetype/ftlist.h new file mode 100644 index 0000000..55f0159 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftlist.h @@ -0,0 +1,296 @@ +/**************************************************************************** + * + * ftlist.h + * + * Generic list support for FreeType (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file implements functions relative to list processing. Its data + * structures are defined in `freetype.h`. + * + */ + + +#ifndef FTLIST_H_ +#define FTLIST_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * list_processing + * + * @title: + * List Processing + * + * @abstract: + * Simple management of lists. + * + * @description: + * This section contains various definitions related to list processing + * using doubly-linked nodes. + * + * @order: + * FT_List + * FT_ListNode + * FT_ListRec + * FT_ListNodeRec + * + * FT_List_Add + * FT_List_Insert + * FT_List_Find + * FT_List_Remove + * FT_List_Up + * FT_List_Iterate + * FT_List_Iterator + * FT_List_Finalize + * FT_List_Destructor + * + */ + + + /************************************************************************** + * + * @function: + * FT_List_Find + * + * @description: + * Find the list node for a given listed object. + * + * @input: + * list :: + * A pointer to the parent list. + * data :: + * The address of the listed object. + * + * @return: + * List node. `NULL` if it wasn't found. + */ + FT_EXPORT( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ); + + + /************************************************************************** + * + * @function: + * FT_List_Add + * + * @description: + * Append an element to the end of a list. + * + * @inout: + * list :: + * A pointer to the parent list. + * node :: + * The node to append. + */ + FT_EXPORT( void ) + FT_List_Add( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Insert + * + * @description: + * Insert an element at the head of a list. + * + * @inout: + * list :: + * A pointer to parent list. + * node :: + * The node to insert. + */ + FT_EXPORT( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Remove + * + * @description: + * Remove a node from a list. This function doesn't check whether the + * node is in the list! + * + * @input: + * node :: + * The node to remove. + * + * @inout: + * list :: + * A pointer to the parent list. + */ + FT_EXPORT( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Up + * + * @description: + * Move a node to the head/top of a list. Used to maintain LRU lists. + * + * @inout: + * list :: + * A pointer to the parent list. + * node :: + * The node to move. + */ + FT_EXPORT( void ) + FT_List_Up( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @functype: + * FT_List_Iterator + * + * @description: + * An FT_List iterator function that is called during a list parse by + * @FT_List_Iterate. + * + * @input: + * node :: + * The current iteration list node. + * + * user :: + * A typeless pointer passed to @FT_List_Iterate. Can be used to point + * to the iteration's state. + */ + typedef FT_Error + (*FT_List_Iterator)( FT_ListNode node, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_List_Iterate + * + * @description: + * Parse a list and calls a given iterator function on each element. + * Note that parsing is stopped as soon as one of the iterator calls + * returns a non-zero value. + * + * @input: + * list :: + * A handle to the list. + * iterator :: + * An iterator function, called on each node of the list. + * user :: + * A user-supplied field that is passed as the second argument to the + * iterator. + * + * @return: + * The result (a FreeType error code) of the last iterator call. + */ + FT_EXPORT( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ); + + + /************************************************************************** + * + * @functype: + * FT_List_Destructor + * + * @description: + * An @FT_List iterator function that is called during a list + * finalization by @FT_List_Finalize to destroy all elements in a given + * list. + * + * @input: + * system :: + * The current system object. + * + * data :: + * The current object to destroy. + * + * user :: + * A typeless pointer passed to @FT_List_Iterate. It can be used to + * point to the iteration's state. + */ + typedef void + (*FT_List_Destructor)( FT_Memory memory, + void* data, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_List_Finalize + * + * @description: + * Destroy all elements in the list as well as the list itself. + * + * @input: + * list :: + * A handle to the list. + * + * destroy :: + * A list destructor that will be applied to each element of the list. + * Set this to `NULL` if not needed. + * + * memory :: + * The current memory object that handles deallocation. + * + * user :: + * A user-supplied field that is passed as the last argument to the + * destructor. + * + * @note: + * This function expects that all nodes added by @FT_List_Add or + * @FT_List_Insert have been dynamically allocated. + */ + FT_EXPORT( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLIST_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftlogging.h b/NothinFancy/dep/include/freetype/ftlogging.h new file mode 100644 index 0000000..a558b85 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftlogging.h @@ -0,0 +1,184 @@ +/**************************************************************************** + * + * ftlogging.h + * + * Additional debugging APIs. + * + * Copyright (C) 2020-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTLOGGING_H_ +#define FTLOGGING_H_ + + +#include +#include FT_CONFIG_CONFIG_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * debugging_apis + * + * @title: + * External Debugging APIs + * + * @abstract: + * Public APIs to control the `FT_DEBUG_LOGGING` macro. + * + * @description: + * This section contains the declarations of public functions that + * enables fine control of what the `FT_DEBUG_LOGGING` macro outputs. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Trace_Set_Level + * + * @description: + * Change the levels of tracing components of FreeType at run time. + * + * @input: + * tracing_level :: + * New tracing value. + * + * @example: + * The following call makes FreeType trace everything but the 'memory' + * component. + * + * ``` + * FT_Trace_Set_Level( "any:7 memory:0 ); + * ``` + * + * @note: + * This function does nothing if compilation option `FT_DEBUG_LOGGING` + * isn't set. + * + * @since: + * 2.11 + * + */ + FT_EXPORT( void ) + FT_Trace_Set_Level( const char* tracing_level ); + + + /************************************************************************** + * + * @function: + * FT_Trace_Set_Default_Level + * + * @description: + * Reset tracing value of FreeType's components to the default value + * (i.e., to the value of the `FT2_DEBUG` environment value or to NULL + * if `FT2_DEBUG` is not set). + * + * @note: + * This function does nothing if compilation option `FT_DEBUG_LOGGING` + * isn't set. + * + * @since: + * 2.11 + * + */ + FT_EXPORT( void ) + FT_Trace_Set_Default_Level( void ); + + + /************************************************************************** + * + * @functype: + * FT_Custom_Log_Handler + * + * @description: + * A function typedef that is used to handle the logging of tracing and + * debug messages on a file system. + * + * @input: + * ft_component :: + * The name of `FT_COMPONENT` from which the current debug or error + * message is produced. + * + * fmt :: + * Actual debug or tracing message. + * + * args:: + * Arguments of debug or tracing messages. + * + * @since: + * 2.11 + * + */ + typedef void + (*FT_Custom_Log_Handler)( const char* ft_component, + const char* fmt, + va_list args ); + + + /************************************************************************** + * + * @function: + * FT_Set_Log_Handler + * + * @description: + * A function to set a custom log handler. + * + * @input: + * handler :: + * New logging function. + * + * @note: + * This function does nothing if compilation option `FT_DEBUG_LOGGING` + * isn't set. + * + * @since: + * 2.11 + * + */ + FT_EXPORT( void ) + FT_Set_Log_Handler( FT_Custom_Log_Handler handler ); + + + /************************************************************************** + * + * @function: + * FT_Set_Default_Log_Handler + * + * @description: + * A function to undo the effect of @FT_Set_Log_Handler, resetting the + * log handler to FreeType's built-in version. + * + * @note: + * This function does nothing if compilation option `FT_DEBUG_LOGGING` + * isn't set. + * + * @since: + * 2.11 + * + */ + FT_EXPORT( void ) + FT_Set_Default_Log_Handler( void ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLOGGING_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftlzw.h b/NothinFancy/dep/include/freetype/ftlzw.h new file mode 100644 index 0000000..fce1c9c --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftlzw.h @@ -0,0 +1,100 @@ +/**************************************************************************** + * + * ftlzw.h + * + * LZW-compressed stream support. + * + * Copyright (C) 2004-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTLZW_H_ +#define FTLZW_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * lzw + * + * @title: + * LZW Streams + * + * @abstract: + * Using LZW-compressed font files. + * + * @description: + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it and + * re-open the face with it. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream, + * which significantly undermines the performance. + * + * This section contains the declaration of LZW-specific functions. + * + */ + + /************************************************************************** + * + * @function: + * FT_Stream_OpenLZW + * + * @description: + * Open a new stream to parse LZW-compressed font files. This is mainly + * used to support the compressed `*.pcf.Z` fonts that come with XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with LZW support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLZW_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftmac.h b/NothinFancy/dep/include/freetype/ftmac.h new file mode 100644 index 0000000..607af9b --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftmac.h @@ -0,0 +1,289 @@ +/**************************************************************************** + * + * ftmac.h + * + * Additional Mac-specific API. + * + * Copyright (C) 1996-2021 by + * Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +/**************************************************************************** + * + * NOTE: Include this file after `FT_FREETYPE_H` and after any + * Mac-specific headers (because this header uses Mac types such as + * 'Handle', 'FSSpec', 'FSRef', etc.) + * + */ + + +#ifndef FTMAC_H_ +#define FTMAC_H_ + + + + +FT_BEGIN_HEADER + + + /* gcc-3.1 and later can warn about functions tagged as deprecated */ +#ifndef FT_DEPRECATED_ATTRIBUTE +#if defined( __GNUC__ ) && \ + ( ( __GNUC__ >= 4 ) || \ + ( ( __GNUC__ == 3 ) && ( __GNUC_MINOR__ >= 1 ) ) ) +#define FT_DEPRECATED_ATTRIBUTE __attribute__(( deprecated )) +#else +#define FT_DEPRECATED_ATTRIBUTE +#endif +#endif + + + /************************************************************************** + * + * @section: + * mac_specific + * + * @title: + * Mac Specific Interface + * + * @abstract: + * Only available on the Macintosh. + * + * @description: + * The following definitions are only available if FreeType is compiled + * on a Macintosh. + * + */ + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FOND + * + * @description: + * Create a new face object from a FOND resource. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * fond :: + * A FOND resource. + * + * face_index :: + * Only supported for the -1 'sanity check' special case. + * + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @example: + * This function can be used to create @FT_Face objects from fonts that + * are installed in the system as follows. + * + * ``` + * fond = GetResource( 'FOND', fontName ); + * error = FT_New_Face_From_FOND( library, fond, 0, &face ); + * ``` + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFile_From_Mac_Name + * + * @description: + * Return an FSSpec for the disk file containing the named font. + * + * @input: + * fontName :: + * Mac OS name of the font (e.g., Times New Roman Bold). + * + * @output: + * pathSpec :: + * FSSpec to the file. For passing to @FT_New_Face_From_FSSpec. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face_From_FSSpec. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFile_From_Mac_ATS_Name + * + * @description: + * Return an FSSpec for the disk file containing the named font. + * + * @input: + * fontName :: + * Mac OS name of the font in ATS framework. + * + * @output: + * pathSpec :: + * FSSpec to the file. For passing to @FT_New_Face_From_FSSpec. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face_From_FSSpec. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFilePath_From_Mac_ATS_Name + * + * @description: + * Return a pathname of the disk file and face index for given font name + * that is handled by ATS framework. + * + * @input: + * fontName :: + * Mac OS name of the font in ATS framework. + * + * @output: + * path :: + * Buffer to store pathname of the file. For passing to @FT_New_Face. + * The client must allocate this buffer before calling this function. + * + * maxPathSize :: + * Lengths of the buffer `path` that client allocated. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FSSpec + * + * @description: + * Create a new face object from a given resource and typeface index + * using an FSSpec to the font file. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * spec :: + * FSSpec to the font file. + * + * face_index :: + * The index of the face within the resource. The first face has + * index~0. + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * @FT_New_Face_From_FSSpec is identical to @FT_New_Face except it + * accepts an FSSpec instead of a path. + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FSRef + * + * @description: + * Create a new face object from a given resource and typeface index + * using an FSRef to the font file. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * spec :: + * FSRef to the font file. + * + * face_index :: + * The index of the face within the resource. The first face has + * index~0. + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * @FT_New_Face_From_FSRef is identical to @FT_New_Face except it accepts + * an FSRef instead of a path. + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef *ref, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + /* */ + + +FT_END_HEADER + + +#endif /* FTMAC_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftmm.h b/NothinFancy/dep/include/freetype/ftmm.h new file mode 100644 index 0000000..32579e9 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftmm.h @@ -0,0 +1,752 @@ +/**************************************************************************** + * + * ftmm.h + * + * FreeType Multiple Master font interface (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMM_H_ +#define FTMM_H_ + + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * multiple_masters + * + * @title: + * Multiple Masters + * + * @abstract: + * How to manage Multiple Masters fonts. + * + * @description: + * The following types and functions are used to manage Multiple Master + * fonts, i.e., the selection of specific design instances by setting + * design axis coordinates. + * + * Besides Adobe MM fonts, the interface supports Apple's TrueType GX and + * OpenType variation fonts. Some of the routines only work with Adobe + * MM fonts, others will work with all three types. They are similar + * enough that a consistent interface makes sense. + * + */ + + + /************************************************************************** + * + * @struct: + * FT_MM_Axis + * + * @description: + * A structure to model a given axis in design space for Multiple Masters + * fonts. + * + * This structure can't be used for TrueType GX or OpenType variation + * fonts. + * + * @fields: + * name :: + * The axis's name. + * + * minimum :: + * The axis's minimum design coordinate. + * + * maximum :: + * The axis's maximum design coordinate. + */ + typedef struct FT_MM_Axis_ + { + FT_String* name; + FT_Long minimum; + FT_Long maximum; + + } FT_MM_Axis; + + + /************************************************************************** + * + * @struct: + * FT_Multi_Master + * + * @description: + * A structure to model the axes and space of a Multiple Masters font. + * + * This structure can't be used for TrueType GX or OpenType variation + * fonts. + * + * @fields: + * num_axis :: + * Number of axes. Cannot exceed~4. + * + * num_designs :: + * Number of designs; should be normally 2^num_axis even though the + * Type~1 specification strangely allows for intermediate designs to be + * present. This number cannot exceed~16. + * + * axis :: + * A table of axis descriptors. + */ + typedef struct FT_Multi_Master_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_MM_Axis axis[T1_MAX_MM_AXIS]; + + } FT_Multi_Master; + + + /************************************************************************** + * + * @struct: + * FT_Var_Axis + * + * @description: + * A structure to model a given axis in design space for Multiple + * Masters, TrueType GX, and OpenType variation fonts. + * + * @fields: + * name :: + * The axis's name. Not always meaningful for TrueType GX or OpenType + * variation fonts. + * + * minimum :: + * The axis's minimum design coordinate. + * + * def :: + * The axis's default design coordinate. FreeType computes meaningful + * default values for Adobe MM fonts. + * + * maximum :: + * The axis's maximum design coordinate. + * + * tag :: + * The axis's tag (the equivalent to 'name' for TrueType GX and + * OpenType variation fonts). FreeType provides default values for + * Adobe MM fonts if possible. + * + * strid :: + * The axis name entry in the font's 'name' table. This is another + * (and often better) version of the 'name' field for TrueType GX or + * OpenType variation fonts. Not meaningful for Adobe MM fonts. + * + * @note: + * The fields `minimum`, `def`, and `maximum` are 16.16 fractional values + * for TrueType GX and OpenType variation fonts. For Adobe MM fonts, the + * values are integers. + */ + typedef struct FT_Var_Axis_ + { + FT_String* name; + + FT_Fixed minimum; + FT_Fixed def; + FT_Fixed maximum; + + FT_ULong tag; + FT_UInt strid; + + } FT_Var_Axis; + + + /************************************************************************** + * + * @struct: + * FT_Var_Named_Style + * + * @description: + * A structure to model a named instance in a TrueType GX or OpenType + * variation font. + * + * This structure can't be used for Adobe MM fonts. + * + * @fields: + * coords :: + * The design coordinates for this instance. This is an array with one + * entry for each axis. + * + * strid :: + * The entry in 'name' table identifying this instance. + * + * psid :: + * The entry in 'name' table identifying a PostScript name for this + * instance. Value 0xFFFF indicates a missing entry. + */ + typedef struct FT_Var_Named_Style_ + { + FT_Fixed* coords; + FT_UInt strid; + FT_UInt psid; /* since 2.7.1 */ + + } FT_Var_Named_Style; + + + /************************************************************************** + * + * @struct: + * FT_MM_Var + * + * @description: + * A structure to model the axes and space of an Adobe MM, TrueType GX, + * or OpenType variation font. + * + * Some fields are specific to one format and not to the others. + * + * @fields: + * num_axis :: + * The number of axes. The maximum value is~4 for Adobe MM fonts; no + * limit in TrueType GX or OpenType variation fonts. + * + * num_designs :: + * The number of designs; should be normally 2^num_axis for Adobe MM + * fonts. Not meaningful for TrueType GX or OpenType variation fonts + * (where every glyph could have a different number of designs). + * + * num_namedstyles :: + * The number of named styles; a 'named style' is a tuple of design + * coordinates that has a string ID (in the 'name' table) associated + * with it. The font can tell the user that, for example, + * [Weight=1.5,Width=1.1] is 'Bold'. Another name for 'named style' is + * 'named instance'. + * + * For Adobe Multiple Masters fonts, this value is always zero because + * the format does not support named styles. + * + * axis :: + * An axis descriptor table. TrueType GX and OpenType variation fonts + * contain slightly more data than Adobe MM fonts. Memory management + * of this pointer is done internally by FreeType. + * + * namedstyle :: + * A named style (instance) table. Only meaningful for TrueType GX and + * OpenType variation fonts. Memory management of this pointer is done + * internally by FreeType. + */ + typedef struct FT_MM_Var_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_UInt num_namedstyles; + FT_Var_Axis* axis; + FT_Var_Named_Style* namedstyle; + + } FT_MM_Var; + + + /************************************************************************** + * + * @function: + * FT_Get_Multi_Master + * + * @description: + * Retrieve a variation descriptor of a given Adobe MM font. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @input: + * face :: + * A handle to the source face. + * + * @output: + * amaster :: + * The Multiple Masters descriptor. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_Var + * + * @description: + * Retrieve a variation descriptor for a given font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * @output: + * amaster :: + * The variation descriptor. Allocates a data structure, which the + * user must deallocate with a call to @FT_Done_MM_Var after use. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Done_MM_Var + * + * @description: + * Free the memory allocated by @FT_Get_MM_Var. + * + * @input: + * library :: + * A handle of the face's parent library object that was used in the + * call to @FT_Get_MM_Var to create `amaster`. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_MM_Var( FT_Library library, + FT_MM_Var *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_Design_Coordinates + * + * @description: + * For Adobe MM fonts, choose an interpolated font design through design + * coordinates. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * An array of design coordinates. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_Var_Design_Coordinates + * + * @description: + * Choose an interpolated font design through design coordinates. + * + * This function works with all supported variation formats. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * An array of design coordinates. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * [Since 2.9] 'Default values' means the currently selected named + * instance (or the base font if no named instance is selected). + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Design_Coordinates + * + * @description: + * Get the design coordinates of the currently selected interpolated + * font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * num_coords :: + * The number of design coordinates to retrieve. If it is larger than + * the number of axes, set the excess values to~0. + * + * @output: + * coords :: + * The design coordinates array. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_Blend_Coordinates + * + * @description: + * Choose an interpolated font design through normalized blend + * coordinates. + * + * This function works with all supported variation formats. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * The design coordinates array (each element must be between 0 and 1.0 + * for Adobe MM fonts, and between -1.0 and 1.0 for TrueType GX and + * OpenType variation fonts). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * [Since 2.9] 'Default values' means the currently selected named + * instance (or the base font if no named instance is selected). + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_Blend_Coordinates + * + * @description: + * Get the normalized blend coordinates of the currently selected + * interpolated font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * num_coords :: + * The number of normalized blend coordinates to retrieve. If it is + * larger than the number of axes, set the excess values to~0.5 for + * Adobe MM fonts, and to~0 for TrueType GX and OpenType variation + * fonts. + * + * @output: + * coords :: + * The normalized blend coordinates array. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_Var_Blend_Coordinates + * + * @description: + * This is another name of @FT_Set_MM_Blend_Coordinates. + */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Blend_Coordinates + * + * @description: + * This is another name of @FT_Get_MM_Blend_Coordinates. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_WeightVector + * + * @description: + * For Adobe MM fonts, choose an interpolated font design by directly + * setting the weight vector. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * len :: + * The length of the weight vector array. If it is larger than the + * number of designs, the extra values are ignored. If it is less than + * the number of designs, the remaining values are set to zero. + * + * weightvector :: + * An array representing the weight vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Adobe Multiple Master fonts limit the number of designs, and thus the + * length of the weight vector to~16. + * + * If `len` is zero and `weightvector` is `NULL`, the weight vector array + * is reset to the default values. + * + * The Adobe documentation also states that the values in the + * WeightVector array must total 1.0 +/-~0.001. In practice this does + * not seem to be enforced, so is not enforced here, either. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_WeightVector( FT_Face face, + FT_UInt len, + FT_Fixed* weightvector ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_WeightVector + * + * @description: + * For Adobe MM fonts, retrieve the current weight vector of the font. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * len :: + * A pointer to the size of the array to be filled. If the size of the + * array is less than the number of designs, `FT_Err_Invalid_Argument` + * is returned, and `len` is set to the required size (the number of + * designs). If the size of the array is greater than the number of + * designs, the remaining entries are set to~0. On successful + * completion, `len` is set to the number of designs (i.e., the number + * of values written to the array). + * + * @output: + * weightvector :: + * An array to be filled. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Adobe Multiple Master fonts limit the number of designs, and thus the + * length of the WeightVector to~16. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_WeightVector( FT_Face face, + FT_UInt* len, + FT_Fixed* weightvector ); + + + /************************************************************************** + * + * @enum: + * FT_VAR_AXIS_FLAG_XXX + * + * @description: + * A list of bit flags used in the return value of + * @FT_Get_Var_Axis_Flags. + * + * @values: + * FT_VAR_AXIS_FLAG_HIDDEN :: + * The variation axis should not be exposed to user interfaces. + * + * @since: + * 2.8.1 + */ +#define FT_VAR_AXIS_FLAG_HIDDEN 1 + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Axis_Flags + * + * @description: + * Get the 'flags' field of an OpenType Variation Axis Record. + * + * Not meaningful for Adobe MM fonts (`*flags` is always zero). + * + * @input: + * master :: + * The variation descriptor. + * + * axis_index :: + * The index of the requested variation axis. + * + * @output: + * flags :: + * The 'flags' field. See @FT_VAR_AXIS_FLAG_XXX for possible values. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.8.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Axis_Flags( FT_MM_Var* master, + FT_UInt axis_index, + FT_UInt* flags ); + + + /************************************************************************** + * + * @function: + * FT_Set_Named_Instance + * + * @description: + * Set or change the current named instance. + * + * @input: + * face :: + * A handle to the source face. + * + * instance_index :: + * The index of the requested instance, starting with value 1. If set + * to value 0, FreeType switches to font access without a named + * instance. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The function uses the value of `instance_index` to set bits 16-30 of + * the face's `face_index` field. It also resets any variation applied + * to the font, and the @FT_FACE_FLAG_VARIATION bit of the face's + * `face_flags` field gets reset to zero (i.e., @FT_IS_VARIATION will + * return false). + * + * For Adobe MM fonts (which don't have named instances) this function + * simply resets the current face to the default instance. + * + * @since: + * 2.9 + */ + FT_EXPORT( FT_Error ) + FT_Set_Named_Instance( FT_Face face, + FT_UInt instance_index ); + + /* */ + + +FT_END_HEADER + +#endif /* FTMM_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftmodapi.h b/NothinFancy/dep/include/freetype/ftmodapi.h new file mode 100644 index 0000000..cb15423 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftmodapi.h @@ -0,0 +1,806 @@ +/**************************************************************************** + * + * ftmodapi.h + * + * FreeType modules public interface (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMODAPI_H_ +#define FTMODAPI_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * module_management + * + * @title: + * Module Management + * + * @abstract: + * How to add, upgrade, remove, and control modules from FreeType. + * + * @description: + * The definitions below are used to manage modules within FreeType. + * Internal and external modules can be added, upgraded, and removed at + * runtime. For example, an alternative renderer or proprietary font + * driver can be registered and prioritized. Additionally, some module + * properties can also be controlled. + * + * Here is a list of existing values of the `module_name` field in the + * @FT_Module_Class structure. + * + * ``` + * autofitter + * bdf + * cff + * gxvalid + * otvalid + * pcf + * pfr + * psaux + * pshinter + * psnames + * raster1 + * sfnt + * smooth + * truetype + * type1 + * type42 + * t1cid + * winfonts + * ``` + * + * Note that the FreeType Cache sub-system is not a FreeType module. + * + * @order: + * FT_Module + * FT_Module_Constructor + * FT_Module_Destructor + * FT_Module_Requester + * FT_Module_Class + * + * FT_Add_Module + * FT_Get_Module + * FT_Remove_Module + * FT_Add_Default_Modules + * + * FT_FACE_DRIVER_NAME + * FT_Property_Set + * FT_Property_Get + * FT_Set_Default_Properties + * + * FT_New_Library + * FT_Done_Library + * FT_Reference_Library + * + * FT_Renderer + * FT_Renderer_Class + * + * FT_Get_Renderer + * FT_Set_Renderer + * + * FT_Set_Debug_Hook + * + */ + + + /* module bit flags */ +#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ +#define FT_MODULE_RENDERER 2 /* this module is a renderer */ +#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ +#define FT_MODULE_STYLER 8 /* this module is a styler */ + +#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ + /* scalable fonts */ +#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ + /* support vector outlines */ +#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ + /* own hinter */ +#define FT_MODULE_DRIVER_HINTS_LIGHTLY 0x800 /* the driver's hinter */ + /* produces LIGHT hints */ + + + /* deprecated values */ +#define ft_module_font_driver FT_MODULE_FONT_DRIVER +#define ft_module_renderer FT_MODULE_RENDERER +#define ft_module_hinter FT_MODULE_HINTER +#define ft_module_styler FT_MODULE_STYLER + +#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE +#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES +#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER +#define ft_module_driver_hints_lightly FT_MODULE_DRIVER_HINTS_LIGHTLY + + + typedef FT_Pointer FT_Module_Interface; + + + /************************************************************************** + * + * @functype: + * FT_Module_Constructor + * + * @description: + * A function used to initialize (not create) a new module object. + * + * @input: + * module :: + * The module to initialize. + */ + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + + /************************************************************************** + * + * @functype: + * FT_Module_Destructor + * + * @description: + * A function used to finalize (not destroy) a given module object. + * + * @input: + * module :: + * The module to finalize. + */ + typedef void + (*FT_Module_Destructor)( FT_Module module ); + + + /************************************************************************** + * + * @functype: + * FT_Module_Requester + * + * @description: + * A function used to query a given module for a specific interface. + * + * @input: + * module :: + * The module to be searched. + * + * name :: + * The name of the interface in the module. + */ + typedef FT_Module_Interface + (*FT_Module_Requester)( FT_Module module, + const char* name ); + + + /************************************************************************** + * + * @struct: + * FT_Module_Class + * + * @description: + * The module class descriptor. While being a public structure necessary + * for FreeType's module bookkeeping, most of the fields are essentially + * internal, not to be used directly by an application. + * + * @fields: + * module_flags :: + * Bit flags describing the module. + * + * module_size :: + * The size of one module object/instance in bytes. + * + * module_name :: + * The name of the module. + * + * module_version :: + * The version, as a 16.16 fixed number (major.minor). + * + * module_requires :: + * The version of FreeType this module requires, as a 16.16 fixed + * number (major.minor). Starts at version 2.0, i.e., 0x20000. + * + * module_interface :: + * A typeless pointer to a structure (which varies between different + * modules) that holds the module's interface functions. This is + * essentially what `get_interface` returns. + * + * module_init :: + * The initializing function. + * + * module_done :: + * The finalizing function. + * + * get_interface :: + * The interface requesting function. + */ + typedef struct FT_Module_Class_ + { + FT_ULong module_flags; + FT_Long module_size; + const FT_String* module_name; + FT_Fixed module_version; + FT_Fixed module_requires; + + const void* module_interface; + + FT_Module_Constructor module_init; + FT_Module_Destructor module_done; + FT_Module_Requester get_interface; + + } FT_Module_Class; + + + /************************************************************************** + * + * @function: + * FT_Add_Module + * + * @description: + * Add a new module to a given library instance. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * clazz :: + * A pointer to class descriptor for the module. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An error will be returned if a module already exists by that name, or + * if the module requires a version of FreeType that is too great. + */ + FT_EXPORT( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ); + + + /************************************************************************** + * + * @function: + * FT_Get_Module + * + * @description: + * Find a module by its name. + * + * @input: + * library :: + * A handle to the library object. + * + * module_name :: + * The module's name (as an ASCII string). + * + * @return: + * A module handle. 0~if none was found. + * + * @note: + * FreeType's internal modules aren't documented very well, and you + * should look up the source code for details. + */ + FT_EXPORT( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ); + + + /************************************************************************** + * + * @function: + * FT_Remove_Module + * + * @description: + * Remove a given module from a library instance. + * + * @inout: + * library :: + * A handle to a library object. + * + * @input: + * module :: + * A handle to a module object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The module object is destroyed by the function in case of success. + */ + FT_EXPORT( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ); + + + /************************************************************************** + * + * @macro: + * FT_FACE_DRIVER_NAME + * + * @description: + * A macro that retrieves the name of a font driver from a face object. + * + * @note: + * The font driver name is a valid `module_name` for @FT_Property_Set + * and @FT_Property_Get. This is not the same as @FT_Get_Font_Format. + * + * @since: + * 2.11 + * + */ +#define FT_FACE_DRIVER_NAME( face ) \ + ( ( *(FT_Module_Class**)( ( face )->driver ) )->module_name ) + + + /************************************************************************** + * + * @function: + * FT_Property_Set + * + * @description: + * Set a property for a given module. + * + * @input: + * library :: + * A handle to the library the module is part of. + * + * module_name :: + * The module name. + * + * property_name :: + * The property name. Properties are described in section + * @properties. + * + * Note that only a few modules have properties. + * + * value :: + * A generic pointer to a variable or structure that gives the new + * value of the property. The exact definition of `value` is + * dependent on the property; see section @properties. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `module_name` isn't a valid module name, or `property_name` + * doesn't specify a valid property, or if `value` doesn't represent a + * valid value for the given property, an error is returned. + * + * The following example sets property 'bar' (a simple integer) in + * module 'foo' to value~1. + * + * ``` + * FT_UInt bar; + * + * + * bar = 1; + * FT_Property_Set( library, "foo", "bar", &bar ); + * ``` + * + * Note that the FreeType Cache sub-system doesn't recognize module + * property changes. To avoid glyph lookup confusion within the cache + * you should call @FTC_Manager_Reset to completely flush the cache if a + * module property gets changed after @FTC_Manager_New has been called. + * + * It is not possible to set properties of the FreeType Cache sub-system + * itself with FT_Property_Set; use @FTC_Property_Set instead. + * + * @since: + * 2.4.11 + * + */ + FT_EXPORT( FT_Error ) + FT_Property_Set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + const void* value ); + + + /************************************************************************** + * + * @function: + * FT_Property_Get + * + * @description: + * Get a module's property value. + * + * @input: + * library :: + * A handle to the library the module is part of. + * + * module_name :: + * The module name. + * + * property_name :: + * The property name. Properties are described in section + * @properties. + * + * @inout: + * value :: + * A generic pointer to a variable or structure that gives the value + * of the property. The exact definition of `value` is dependent on + * the property; see section @properties. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `module_name` isn't a valid module name, or `property_name` + * doesn't specify a valid property, or if `value` doesn't represent a + * valid value for the given property, an error is returned. + * + * The following example gets property 'baz' (a range) in module 'foo'. + * + * ``` + * typedef range_ + * { + * FT_Int32 min; + * FT_Int32 max; + * + * } range; + * + * range baz; + * + * + * FT_Property_Get( library, "foo", "baz", &baz ); + * ``` + * + * It is not possible to retrieve properties of the FreeType Cache + * sub-system with FT_Property_Get; use @FTC_Property_Get instead. + * + * @since: + * 2.4.11 + * + */ + FT_EXPORT( FT_Error ) + FT_Property_Get( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + void* value ); + + + /************************************************************************** + * + * @function: + * FT_Set_Default_Properties + * + * @description: + * If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is + * set, this function reads the `FREETYPE_PROPERTIES` environment + * variable to control driver properties. See section @properties for + * more. + * + * If the compilation option is not set, this function does nothing. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=0 + * ``` + * + * @inout: + * library :: + * A handle to a new library object. + * + * @since: + * 2.8 + */ + FT_EXPORT( void ) + FT_Set_Default_Properties( FT_Library library ); + + + /************************************************************************** + * + * @function: + * FT_Reference_Library + * + * @description: + * A counter gets initialized to~1 at the time an @FT_Library structure + * is created. This function increments the counter. @FT_Done_Library + * then only destroys a library if the counter is~1, otherwise it simply + * decrements the counter. + * + * This function helps in managing life-cycles of structures that + * reference @FT_Library objects. + * + * @input: + * library :: + * A handle to a target library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.4.2 + */ + FT_EXPORT( FT_Error ) + FT_Reference_Library( FT_Library library ); + + + /************************************************************************** + * + * @function: + * FT_New_Library + * + * @description: + * This function is used to create a new FreeType library instance from a + * given memory object. It is thus possible to use libraries with + * distinct memory allocators within the same program. Note, however, + * that the used @FT_Memory structure is expected to remain valid for the + * life of the @FT_Library object. + * + * Normally, you would call this function (followed by a call to + * @FT_Add_Default_Modules or a series of calls to @FT_Add_Module, and a + * call to @FT_Set_Default_Properties) instead of @FT_Init_FreeType to + * initialize the FreeType library. + * + * Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a library + * instance. + * + * @input: + * memory :: + * A handle to the original memory object. + * + * @output: + * alibrary :: + * A pointer to handle of a new library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Library. + */ + FT_EXPORT( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /************************************************************************** + * + * @function: + * FT_Done_Library + * + * @description: + * Discard a given library object. This closes all drivers and discards + * all resource objects. + * + * @input: + * library :: + * A handle to the target library. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Library. + */ + FT_EXPORT( FT_Error ) + FT_Done_Library( FT_Library library ); + + + /************************************************************************** + * + * @functype: + * FT_DebugHook_Func + * + * @description: + * A drop-in replacement (or rather a wrapper) for the bytecode or + * charstring interpreter's main loop function. + * + * Its job is essentially + * + * - to activate debug mode to enforce single-stepping, + * + * - to call the main loop function to interpret the next opcode, and + * + * - to show the changed context to the user. + * + * An example for such a main loop function is `TT_RunIns` (declared in + * FreeType's internal header file `src/truetype/ttinterp.h`). + * + * Have a look at the source code of the `ttdebug` FreeType demo program + * for an example of a drop-in replacement. + * + * @inout: + * arg :: + * A typeless pointer, to be cast to the main loop function's data + * structure (which depends on the font module). For TrueType fonts + * it is bytecode interpreter's execution context, `TT_ExecContext`, + * which is declared in FreeType's internal header file `tttypes.h`. + */ + typedef FT_Error + (*FT_DebugHook_Func)( void* arg ); + + + /************************************************************************** + * + * @enum: + * FT_DEBUG_HOOK_XXX + * + * @description: + * A list of named debug hook indices. + * + * @values: + * FT_DEBUG_HOOK_TRUETYPE:: + * This hook index identifies the TrueType bytecode debugger. + */ +#define FT_DEBUG_HOOK_TRUETYPE 0 + + + /************************************************************************** + * + * @function: + * FT_Set_Debug_Hook + * + * @description: + * Set a debug hook function for debugging the interpreter of a font + * format. + * + * While this is a public API function, an application needs access to + * FreeType's internal header files to do something useful. + * + * Have a look at the source code of the `ttdebug` FreeType demo program + * for an example of its usage. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * hook_index :: + * The index of the debug hook. You should use defined enumeration + * macros like @FT_DEBUG_HOOK_TRUETYPE. + * + * debug_hook :: + * The function used to debug the interpreter. + * + * @note: + * Currently, four debug hook slots are available, but only one (for the + * TrueType interpreter) is defined. + */ + FT_EXPORT( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + /************************************************************************** + * + * @function: + * FT_Add_Default_Modules + * + * @description: + * Add the set of default drivers to a given library object. This is + * only useful when you create a library object with @FT_New_Library + * (usually to plug a custom memory manager). + * + * @inout: + * library :: + * A handle to a new library object. + */ + FT_EXPORT( void ) + FT_Add_Default_Modules( FT_Library library ); + + + + /************************************************************************** + * + * @section: + * truetype_engine + * + * @title: + * The TrueType Engine + * + * @abstract: + * TrueType bytecode support. + * + * @description: + * This section contains a function used to query the level of TrueType + * bytecode support compiled in this version of the library. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_TrueTypeEngineType + * + * @description: + * A list of values describing which kind of TrueType bytecode engine is + * implemented in a given FT_Library instance. It is used by the + * @FT_Get_TrueType_Engine_Type function. + * + * @values: + * FT_TRUETYPE_ENGINE_TYPE_NONE :: + * The library doesn't implement any kind of bytecode interpreter. + * + * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: + * Deprecated and removed. + * + * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: + * The library implements a bytecode interpreter that covers the full + * instruction set of the TrueType virtual machine (this was governed + * by patents until May 2010, hence the name). + * + * @since: + * 2.2 + * + */ + typedef enum FT_TrueTypeEngineType_ + { + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, + FT_TRUETYPE_ENGINE_TYPE_PATENTED + + } FT_TrueTypeEngineType; + + + /************************************************************************** + * + * @function: + * FT_Get_TrueType_Engine_Type + * + * @description: + * Return an @FT_TrueTypeEngineType value to indicate which level of the + * TrueType virtual machine a given library instance supports. + * + * @input: + * library :: + * A library instance. + * + * @return: + * A value indicating which level is supported. + * + * @since: + * 2.2 + * + */ + FT_EXPORT( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ); + + /* */ + + +FT_END_HEADER + +#endif /* FTMODAPI_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftmoderr.h b/NothinFancy/dep/include/freetype/ftmoderr.h new file mode 100644 index 0000000..b417cd5 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftmoderr.h @@ -0,0 +1,204 @@ +/**************************************************************************** + * + * ftmoderr.h + * + * FreeType module error offsets (specification). + * + * Copyright (C) 2001-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the FreeType module error codes. + * + * If the macro `FT_CONFIG_OPTION_USE_MODULE_ERRORS` in `ftoption.h` is + * set, the lower byte of an error value identifies the error code as + * usual. In addition, the higher byte identifies the module. For + * example, the error `FT_Err_Invalid_File_Format` has value 0x0003, the + * error `TT_Err_Invalid_File_Format` has value 0x1303, the error + * `T1_Err_Invalid_File_Format` has value 0x1403, etc. + * + * Note that `FT_Err_Ok`, `TT_Err_Ok`, etc. are always equal to zero, + * including the high byte. + * + * If `FT_CONFIG_OPTION_USE_MODULE_ERRORS` isn't set, the higher byte of an + * error value is set to zero. + * + * To hide the various `XXX_Err_` prefixes in the source code, FreeType + * provides some macros in `fttypes.h`. + * + * FT_ERR( err ) + * + * Add current error module prefix (as defined with the `FT_ERR_PREFIX` + * macro) to `err`. For example, in the BDF module the line + * + * ``` + * error = FT_ERR( Invalid_Outline ); + * ``` + * + * expands to + * + * ``` + * error = BDF_Err_Invalid_Outline; + * ``` + * + * For simplicity, you can always use `FT_Err_Ok` directly instead of + * `FT_ERR( Ok )`. + * + * FT_ERR_EQ( errcode, err ) + * FT_ERR_NEQ( errcode, err ) + * + * Compare error code `errcode` with the error `err` for equality and + * inequality, respectively. Example: + * + * ``` + * if ( FT_ERR_EQ( error, Invalid_Outline ) ) + * ... + * ``` + * + * Using this macro you don't have to think about error prefixes. Of + * course, if module errors are not active, the above example is the + * same as + * + * ``` + * if ( error == FT_Err_Invalid_Outline ) + * ... + * ``` + * + * FT_ERROR_BASE( errcode ) + * FT_ERROR_MODULE( errcode ) + * + * Get base error and module error code, respectively. + * + * It can also be used to create a module error message table easily with + * something like + * + * ``` + * #undef FTMODERR_H_ + * #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, + * #define FT_MODERR_START_LIST { + * #define FT_MODERR_END_LIST { 0, 0 } }; + * + * const struct + * { + * int mod_err_offset; + * const char* mod_err_msg + * } ft_mod_errors[] = + * + * #include + * ``` + * + */ + + +#ifndef FTMODERR_H_ +#define FTMODERR_H_ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#ifndef FT_MODERRDEF + +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, +#else +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, +#endif + +#define FT_MODERR_START_LIST enum { +#define FT_MODERR_END_LIST FT_Mod_Err_Max }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_MODERRDEF */ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST MODULE ERROR BASES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_MODERR_START_LIST + FT_MODERR_START_LIST +#endif + + + FT_MODERRDEF( Base, 0x000, "base module" ) + FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) + FT_MODERRDEF( BDF, 0x200, "BDF module" ) + FT_MODERRDEF( Bzip2, 0x300, "Bzip2 module" ) + FT_MODERRDEF( Cache, 0x400, "cache module" ) + FT_MODERRDEF( CFF, 0x500, "CFF module" ) + FT_MODERRDEF( CID, 0x600, "CID module" ) + FT_MODERRDEF( Gzip, 0x700, "Gzip module" ) + FT_MODERRDEF( LZW, 0x800, "LZW module" ) + FT_MODERRDEF( OTvalid, 0x900, "OpenType validation module" ) + FT_MODERRDEF( PCF, 0xA00, "PCF module" ) + FT_MODERRDEF( PFR, 0xB00, "PFR module" ) + FT_MODERRDEF( PSaux, 0xC00, "PS auxiliary module" ) + FT_MODERRDEF( PShinter, 0xD00, "PS hinter module" ) + FT_MODERRDEF( PSnames, 0xE00, "PS names module" ) + FT_MODERRDEF( Raster, 0xF00, "raster module" ) + FT_MODERRDEF( SFNT, 0x1000, "SFNT module" ) + FT_MODERRDEF( Smooth, 0x1100, "smooth raster module" ) + FT_MODERRDEF( TrueType, 0x1200, "TrueType module" ) + FT_MODERRDEF( Type1, 0x1300, "Type 1 module" ) + FT_MODERRDEF( Type42, 0x1400, "Type 42 module" ) + FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" ) + FT_MODERRDEF( GXvalid, 0x1600, "GX validation module" ) + FT_MODERRDEF( Sdf, 0x1700, "Signed distance field raster module" ) + + +#ifdef FT_MODERR_END_LIST + FT_MODERR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_MODERR_START_LIST +#undef FT_MODERR_END_LIST +#undef FT_MODERRDEF +#undef FT_NEED_EXTERN_C + + +#endif /* FTMODERR_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftotval.h b/NothinFancy/dep/include/freetype/ftotval.h new file mode 100644 index 0000000..00f9727 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftotval.h @@ -0,0 +1,206 @@ +/**************************************************************************** + * + * ftotval.h + * + * FreeType API for validating OpenType tables (specification). + * + * Copyright (C) 2004-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +/**************************************************************************** + * + * + * Warning: This module might be moved to a different library in the + * future to avoid a tight dependency between FreeType and the + * OpenType specification. + * + * + */ + + +#ifndef FTOTVAL_H_ +#define FTOTVAL_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * ot_validation + * + * @title: + * OpenType Validation + * + * @abstract: + * An API to validate OpenType tables. + * + * @description: + * This section contains the declaration of functions to validate some + * OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + * @order: + * FT_OpenType_Validate + * FT_OpenType_Free + * + * FT_VALIDATE_OTXXX + * + */ + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_OTXXX + * + * @description: + * A list of bit-field constants used with @FT_OpenType_Validate to + * indicate which OpenType tables should be validated. + * + * @values: + * FT_VALIDATE_BASE :: + * Validate BASE table. + * + * FT_VALIDATE_GDEF :: + * Validate GDEF table. + * + * FT_VALIDATE_GPOS :: + * Validate GPOS table. + * + * FT_VALIDATE_GSUB :: + * Validate GSUB table. + * + * FT_VALIDATE_JSTF :: + * Validate JSTF table. + * + * FT_VALIDATE_MATH :: + * Validate MATH table. + * + * FT_VALIDATE_OT :: + * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + */ +#define FT_VALIDATE_BASE 0x0100 +#define FT_VALIDATE_GDEF 0x0200 +#define FT_VALIDATE_GPOS 0x0400 +#define FT_VALIDATE_GSUB 0x0800 +#define FT_VALIDATE_JSTF 0x1000 +#define FT_VALIDATE_MATH 0x2000 + +#define FT_VALIDATE_OT ( FT_VALIDATE_BASE | \ + FT_VALIDATE_GDEF | \ + FT_VALIDATE_GPOS | \ + FT_VALIDATE_GSUB | \ + FT_VALIDATE_JSTF | \ + FT_VALIDATE_MATH ) + + + /************************************************************************** + * + * @function: + * FT_OpenType_Validate + * + * @description: + * Validate various OpenType tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library that + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the tables to be validated. See + * @FT_VALIDATE_OTXXX for possible values. + * + * @output: + * BASE_table :: + * A pointer to the BASE table. + * + * GDEF_table :: + * A pointer to the GDEF table. + * + * GPOS_table :: + * A pointer to the GPOS table. + * + * GSUB_table :: + * A pointer to the GSUB table. + * + * JSTF_table :: + * A pointer to the JSTF table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with OpenType fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the five tables with + * @FT_OpenType_Free. A `NULL` value indicates that the table either + * doesn't exist in the font, or the application hasn't asked for + * validation. + */ + FT_EXPORT( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ); + + + /************************************************************************** + * + * @function: + * FT_OpenType_Free + * + * @description: + * Free the buffer allocated by OpenType validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_OpenType_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_OpenType_Validate only. + */ + FT_EXPORT( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTOTVAL_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftoutln.h b/NothinFancy/dep/include/freetype/ftoutln.h new file mode 100644 index 0000000..6bb5f80 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftoutln.h @@ -0,0 +1,586 @@ +/**************************************************************************** + * + * ftoutln.h + * + * Support for the FT_Outline type used to store glyph shapes of + * most scalable font formats (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTOUTLN_H_ +#define FTOUTLN_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * outline_processing + * + * @title: + * Outline Processing + * + * @abstract: + * Functions to create, transform, and render vectorial glyph images. + * + * @description: + * This section contains routines used to create and destroy scalable + * glyph images known as 'outlines'. These can also be measured, + * transformed, and converted into bitmaps and pixmaps. + * + * @order: + * FT_Outline + * FT_Outline_New + * FT_Outline_Done + * FT_Outline_Copy + * FT_Outline_Translate + * FT_Outline_Transform + * FT_Outline_Embolden + * FT_Outline_EmboldenXY + * FT_Outline_Reverse + * FT_Outline_Check + * + * FT_Outline_Get_CBox + * FT_Outline_Get_BBox + * + * FT_Outline_Get_Bitmap + * FT_Outline_Render + * FT_Outline_Decompose + * FT_Outline_Funcs + * FT_Outline_MoveToFunc + * FT_Outline_LineToFunc + * FT_Outline_ConicToFunc + * FT_Outline_CubicToFunc + * + * FT_Orientation + * FT_Outline_Get_Orientation + * + * FT_OUTLINE_XXX + * + */ + + + /************************************************************************** + * + * @function: + * FT_Outline_Decompose + * + * @description: + * Walk over an outline's structure to decompose it into individual + * segments and Bezier arcs. This function also emits 'move to' + * operations to indicate the start of new contours in the outline. + * + * @input: + * outline :: + * A pointer to the source target. + * + * func_interface :: + * A table of 'emitters', i.e., function pointers called during + * decomposition to indicate path operations. + * + * @inout: + * user :: + * A typeless pointer that is passed to each emitter during the + * decomposition. It can be used to store the state during the + * decomposition. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * A contour that contains a single point only is represented by a 'move + * to' operation followed by 'line to' to the same point. In most cases, + * it is best to filter this out before using the outline for stroking + * purposes (otherwise it would result in a visible dot when round caps + * are used). + * + * Similarly, the function returns success for an empty outline also + * (doing nothing, this is, not calling any emitter); if necessary, you + * should filter this out, too. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_Outline_New + * + * @description: + * Create a new outline of a given size. + * + * @input: + * library :: + * A handle to the library object from where the outline is allocated. + * Note however that the new outline will **not** necessarily be + * **freed**, when destroying the library, by @FT_Done_FreeType. + * + * numPoints :: + * The maximum number of points within the outline. Must be smaller + * than or equal to 0xFFFF (65535). + * + * numContours :: + * The maximum number of contours within the outline. This value must + * be in the range 0 to `numPoints`. + * + * @output: + * anoutline :: + * A handle to the new outline. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The reason why this function takes a `library` parameter is simply to + * use the library's memory allocator. + */ + FT_EXPORT( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Done + * + * @description: + * Destroy an outline created with @FT_Outline_New. + * + * @input: + * library :: + * A handle of the library object used to allocate the outline. + * + * outline :: + * A pointer to the outline object to be discarded. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the outline's 'owner' field is not set, only the outline descriptor + * will be released. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Check + * + * @description: + * Check the contents of an outline descriptor. + * + * @input: + * outline :: + * A handle to a source outline. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An empty outline, or an outline with a single point only is also + * valid. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Check( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_CBox + * + * @description: + * Return an outline's 'control box'. The control box encloses all the + * outline's points, including Bezier control points. Though it + * coincides with the exact bounding box for most glyphs, it can be + * slightly larger in some situations (like when rotating an outline that + * contains Bezier outside arcs). + * + * Computing the control box is very fast, while getting the bounding box + * can take much more time as it needs to walk over all segments and arcs + * in the outline. To get the latter, you can use the 'ftbbox' + * component, which is dedicated to this single task. + * + * @input: + * outline :: + * A pointer to the source outline descriptor. + * + * @output: + * acbox :: + * The outline's control box. + * + * @note: + * See @FT_Glyph_Get_CBox for a discussion of tricky fonts. + */ + FT_EXPORT( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Translate + * + * @description: + * Apply a simple translation to the points of an outline. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @input: + * xOffset :: + * The horizontal offset. + * + * yOffset :: + * The vertical offset. + */ + FT_EXPORT( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Copy + * + * @description: + * Copy an outline into another one. Both objects must have the same + * sizes (number of points & number of contours) when this function is + * called. + * + * @input: + * source :: + * A handle to the source outline. + * + * @output: + * target :: + * A handle to the target outline. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Transform + * + * @description: + * Apply a simple 2x2 matrix to all of an outline's points. Useful for + * applying rotations, slanting, flipping, etc. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @input: + * matrix :: + * A pointer to the transformation matrix. + * + * @note: + * You can use @FT_Outline_Translate if you need to translate the + * outline's points. + */ + FT_EXPORT( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Embolden + * + * @description: + * Embolden an outline. The new outline will be at most 4~times + * `strength` pixels wider and higher. You may think of the left and + * bottom borders as unchanged. + * + * Negative `strength` values to reduce the outline thickness are + * possible also. + * + * @inout: + * outline :: + * A handle to the target outline. + * + * @input: + * strength :: + * How strong the glyph is emboldened. Expressed in 26.6 pixel format. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The used algorithm to increase or decrease the thickness of the glyph + * doesn't change the number of points; this means that certain + * situations like acute angles or intersections are sometimes handled + * incorrectly. + * + * If you need 'better' metrics values you should call + * @FT_Outline_Get_CBox or @FT_Outline_Get_BBox. + * + * To get meaningful results, font scaling values must be set with + * functions like @FT_Set_Char_Size before calling FT_Render_Glyph. + * + * @example: + * ``` + * FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); + * + * if ( face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) + * FT_Outline_Embolden( &face->glyph->outline, strength ); + * ``` + * + */ + FT_EXPORT( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ); + + + /************************************************************************** + * + * @function: + * FT_Outline_EmboldenXY + * + * @description: + * Embolden an outline. The new outline will be `xstrength` pixels wider + * and `ystrength` pixels higher. Otherwise, it is similar to + * @FT_Outline_Embolden, which uses the same strength in both directions. + * + * @since: + * 2.4.10 + */ + FT_EXPORT( FT_Error ) + FT_Outline_EmboldenXY( FT_Outline* outline, + FT_Pos xstrength, + FT_Pos ystrength ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Reverse + * + * @description: + * Reverse the drawing direction of an outline. This is used to ensure + * consistent fill conventions for mirrored glyphs. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @note: + * This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in the + * outline's `flags` field. + * + * It shouldn't be used by a normal client application, unless it knows + * what it is doing. + */ + FT_EXPORT( void ) + FT_Outline_Reverse( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Bitmap + * + * @description: + * Render an outline within a bitmap. The outline's image is simply + * OR-ed to the target bitmap. + * + * @input: + * library :: + * A handle to a FreeType library object. + * + * outline :: + * A pointer to the source outline descriptor. + * + * @inout: + * abitmap :: + * A pointer to the target bitmap descriptor. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does **not create** the bitmap, it only renders an + * outline image within the one you pass to it! Consequently, the + * various fields in `abitmap` should be set accordingly. + * + * It will use the raster corresponding to the default glyph format. + * + * The value of the `num_grays` field in `abitmap` is ignored. If you + * select the gray-level rasterizer, and you want less than 256 gray + * levels, you have to use @FT_Outline_Render directly. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Render + * + * @description: + * Render an outline within a bitmap using the current scan-convert. + * + * @input: + * library :: + * A handle to a FreeType library object. + * + * outline :: + * A pointer to the source outline descriptor. + * + * @inout: + * params :: + * A pointer to an @FT_Raster_Params structure used to describe the + * rendering operation. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This advanced function uses @FT_Raster_Params as an argument. + * The field `params.source` will be set to `outline` before the scan + * converter is called, which means that the value you give to it is + * actually ignored. Either `params.target` must point to preallocated + * bitmap, or @FT_RASTER_FLAG_DIRECT must be set in `params.flags` + * allowing FreeType rasterizer to be used for direct composition, + * translucency, etc. See @FT_Raster_Params for more details. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ); + + + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and PostScript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must be + * filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the PostScript specification, counter-clockwise + * contours must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of the + * drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in PostScript, everything that is to the left of the + * drawing direction of a contour must be filled. + * + * FT_ORIENTATION_NONE :: + * The orientation cannot be determined. That is, different parts of + * the glyph have different orientation. + * + */ + typedef enum FT_Orientation_ + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its fill + * orientation (see @FT_Orientation). This is done by integrating the + * total area covered by the outline. The positive integral corresponds + * to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT is + * returned. The negative integral corresponds to the counter-clockwise + * orientation and @FT_ORIENTATION_TRUETYPE is returned. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTOUTLN_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/NothinFancy/dep/include/freetype/ftparams.h b/NothinFancy/dep/include/freetype/ftparams.h new file mode 100644 index 0000000..04a3f44 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftparams.h @@ -0,0 +1,203 @@ +/**************************************************************************** + * + * ftparams.h + * + * FreeType API for possible FT_Parameter tags (specification only). + * + * Copyright (C) 2017-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTPARAMS_H_ +#define FTPARAMS_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * parameter_tags + * + * @title: + * Parameter Tags + * + * @abstract: + * Macros for driver property and font loading parameter tags. + * + * @description: + * This section contains macros for the @FT_Parameter structure that are + * used with various functions to activate some special functionality or + * different behaviour of various components of FreeType. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY + * + * @description: + * A tag for @FT_Parameter to make @FT_Open_Face ignore typographic + * family names in the 'name' table (introduced in OpenType version 1.4). + * Use this for backward compatibility with legacy systems that have a + * four-faces-per-family restriction. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY \ + FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) + + + /* this constant is deprecated */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY \ + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY + * + * @description: + * A tag for @FT_Parameter to make @FT_Open_Face ignore typographic + * subfamily names in the 'name' table (introduced in OpenType version + * 1.4). Use this for backward compatibility with legacy systems that + * have a four-faces-per-family restriction. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY \ + FT_MAKE_TAG( 'i', 'g', 'p', 's' ) + + + /* this constant is deprecated */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY \ + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_INCREMENTAL + * + * @description: + * An @FT_Parameter tag to be used with @FT_Open_Face to indicate + * incremental glyph loading. + * + */ +#define FT_PARAM_TAG_INCREMENTAL \ + FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_LCD_FILTER_WEIGHTS + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding argument specifies the five LCD filter weights for a + * given face (if using @FT_LOAD_TARGET_LCD, for example), overriding the + * global default values or the values set up with + * @FT_Library_SetLcdFilterWeights. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_LCD_FILTER_WEIGHTS \ + FT_MAKE_TAG( 'l', 'c', 'd', 'f' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_RANDOM_SEED + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding 32bit signed integer argument overrides the font + * driver's random seed value with a face-specific one; see @random-seed. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_RANDOM_SEED \ + FT_MAKE_TAG( 's', 'e', 'e', 'd' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_STEM_DARKENING + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding Boolean argument specifies whether to apply stem + * darkening, overriding the global default values or the values set up + * with @FT_Property_Set (see @no-stem-darkening). + * + * This is a passive setting that only takes effect if the font driver or + * autohinter honors it, which the CFF, Type~1, and CID drivers always + * do, but the autohinter only in 'light' hinting mode (as of version + * 2.9). + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_STEM_DARKENING \ + FT_MAKE_TAG( 'd', 'a', 'r', 'k' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_UNPATENTED_HINTING + * + * @description: + * Deprecated, no effect. + * + * Previously: A constant used as the tag of an @FT_Parameter structure + * to indicate that unpatented methods only should be used by the + * TrueType bytecode interpreter for a typeface opened by @FT_Open_Face. + * + */ +#define FT_PARAM_TAG_UNPATENTED_HINTING \ + FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) + + + /* */ + + +FT_END_HEADER + + +#endif /* FTPARAMS_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftpfr.h b/NothinFancy/dep/include/freetype/ftpfr.h new file mode 100644 index 0000000..fbdb14c --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftpfr.h @@ -0,0 +1,179 @@ +/**************************************************************************** + * + * ftpfr.h + * + * FreeType API for accessing PFR-specific data (specification only). + * + * Copyright (C) 2002-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTPFR_H_ +#define FTPFR_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * pfr_fonts + * + * @title: + * PFR Fonts + * + * @abstract: + * PFR/TrueDoc-specific API. + * + * @description: + * This section contains the declaration of PFR-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Metrics + * + * @description: + * Return the outline and metrics resolutions of a given PFR face. + * + * @input: + * face :: + * Handle to the input face. It can be a non-PFR face. + * + * @output: + * aoutline_resolution :: + * Outline resolution. This is equivalent to `face->units_per_EM` for + * non-PFR fonts. Optional (parameter can be `NULL`). + * + * ametrics_resolution :: + * Metrics resolution. This is equivalent to `outline_resolution` for + * non-PFR fonts. Optional (parameter can be `NULL`). + * + * ametrics_x_scale :: + * A 16.16 fixed-point number used to scale distance expressed in + * metrics units to device subpixels. This is equivalent to + * `face->size->x_scale`, but for metrics only. Optional (parameter + * can be `NULL`). + * + * ametrics_y_scale :: + * Same as `ametrics_x_scale` but for the vertical direction. + * optional (parameter can be `NULL`). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the input face is not a PFR, this function will return an error. + * However, in all cases, it will return valid values. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ); + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Kerning + * + * @description: + * Return the kerning pair corresponding to two glyphs in a PFR face. + * The distance is expressed in metrics units, unlike the result of + * @FT_Get_Kerning. + * + * @input: + * face :: + * A handle to the input face. + * + * left :: + * Index of the left glyph. + * + * right :: + * Index of the right glyph. + * + * @output: + * avector :: + * A kerning vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function always return distances in original PFR metrics units. + * This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED mode, + * which always returns distances converted to outline units. + * + * You can use the value of the `x_scale` and `y_scale` parameters + * returned by @FT_Get_PFR_Metrics to scale these to device subpixels. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Advance + * + * @description: + * Return a given glyph advance, expressed in original metrics units, + * from a PFR font. + * + * @input: + * face :: + * A handle to the input face. + * + * gindex :: + * The glyph index. + * + * @output: + * aadvance :: + * The glyph advance in metrics units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You can use the `x_scale` or `y_scale` results of @FT_Get_PFR_Metrics + * to convert the advance to device subpixels (i.e., 1/64th of pixels). + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + /* */ + + +FT_END_HEADER + +#endif /* FTPFR_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftrender.h b/NothinFancy/dep/include/freetype/ftrender.h new file mode 100644 index 0000000..48d489d --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftrender.h @@ -0,0 +1,244 @@ +/**************************************************************************** + * + * ftrender.h + * + * FreeType renderer modules public interface (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTRENDER_H_ +#define FTRENDER_H_ + + +#include +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * module_management + * + */ + + + /* create a new glyph object */ + typedef FT_Error + (*FT_Glyph_InitFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + + /* destroys a given glyph object */ + typedef void + (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); + + typedef void + (*FT_Glyph_TransformFunc)( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + typedef void + (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, + FT_BBox* abbox ); + + typedef FT_Error + (*FT_Glyph_CopyFunc)( FT_Glyph source, + FT_Glyph target ); + + typedef FT_Error + (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + +/* deprecated */ +#define FT_Glyph_Init_Func FT_Glyph_InitFunc +#define FT_Glyph_Done_Func FT_Glyph_DoneFunc +#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc +#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc +#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc +#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc + + + struct FT_Glyph_Class_ + { + FT_Long glyph_size; + FT_Glyph_Format glyph_format; + + FT_Glyph_InitFunc glyph_init; + FT_Glyph_DoneFunc glyph_done; + FT_Glyph_CopyFunc glyph_copy; + FT_Glyph_TransformFunc glyph_transform; + FT_Glyph_GetBBoxFunc glyph_bbox; + FT_Glyph_PrepareFunc glyph_prepare; + }; + + + typedef FT_Error + (*FT_Renderer_RenderFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ); + + typedef FT_Error + (*FT_Renderer_TransformFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + + typedef void + (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_BBox* cbox ); + + + typedef FT_Error + (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, + FT_ULong mode_tag, + FT_Pointer mode_ptr ); + +/* deprecated identifiers */ +#define FTRenderer_render FT_Renderer_RenderFunc +#define FTRenderer_transform FT_Renderer_TransformFunc +#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc +#define FTRenderer_setMode FT_Renderer_SetModeFunc + + + /************************************************************************** + * + * @struct: + * FT_Renderer_Class + * + * @description: + * The renderer module class descriptor. + * + * @fields: + * root :: + * The root @FT_Module_Class fields. + * + * glyph_format :: + * The glyph image format this renderer handles. + * + * render_glyph :: + * A method used to render the image that is in a given glyph slot into + * a bitmap. + * + * transform_glyph :: + * A method used to transform the image that is in a given glyph slot. + * + * get_glyph_cbox :: + * A method used to access the glyph's cbox. + * + * set_mode :: + * A method used to pass additional parameters. + * + * raster_class :: + * For @FT_GLYPH_FORMAT_OUTLINE renderers only. This is a pointer to + * its raster's class. + */ + typedef struct FT_Renderer_Class_ + { + FT_Module_Class root; + + FT_Glyph_Format glyph_format; + + FT_Renderer_RenderFunc render_glyph; + FT_Renderer_TransformFunc transform_glyph; + FT_Renderer_GetCBoxFunc get_glyph_cbox; + FT_Renderer_SetModeFunc set_mode; + + FT_Raster_Funcs* raster_class; + + } FT_Renderer_Class; + + + /************************************************************************** + * + * @function: + * FT_Get_Renderer + * + * @description: + * Retrieve the current renderer for a given glyph format. + * + * @input: + * library :: + * A handle to the library object. + * + * format :: + * The glyph format. + * + * @return: + * A renderer handle. 0~if none found. + * + * @note: + * An error will be returned if a module already exists by that name, or + * if the module requires a version of FreeType that is too great. + * + * To add a new renderer, simply use @FT_Add_Module. To retrieve a + * renderer by its name, use @FT_Get_Module. + */ + FT_EXPORT( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ); + + + /************************************************************************** + * + * @function: + * FT_Set_Renderer + * + * @description: + * Set the current renderer to use, and set additional mode. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * renderer :: + * A handle to the renderer object. + * + * num_params :: + * The number of additional parameters. + * + * parameters :: + * Additional parameters. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * In case of success, the renderer will be used to convert glyph images + * in the renderer's known format into bitmaps. + * + * This doesn't change the current renderer for other formats. + * + * Currently, no FreeType renderer module uses `parameters`; you should + * thus always pass `NULL` as the value. + */ + FT_EXPORT( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ); + + /* */ + + +FT_END_HEADER + +#endif /* FTRENDER_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftsizes.h b/NothinFancy/dep/include/freetype/ftsizes.h new file mode 100644 index 0000000..2236639 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftsizes.h @@ -0,0 +1,159 @@ +/**************************************************************************** + * + * ftsizes.h + * + * FreeType size objects management (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * Typical application would normally not need to use these functions. + * However, they have been placed in a public API for the rare cases where + * they are needed. + * + */ + + +#ifndef FTSIZES_H_ +#define FTSIZES_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * sizes_management + * + * @title: + * Size Management + * + * @abstract: + * Managing multiple sizes per face. + * + * @description: + * When creating a new face object (e.g., with @FT_New_Face), an @FT_Size + * object is automatically created and used to store all pixel-size + * dependent information, available in the `face->size` field. + * + * It is however possible to create more sizes for a given face, mostly + * in order to manage several character pixel sizes of the same font + * family and style. See @FT_New_Size and @FT_Done_Size. + * + * Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only modify the + * contents of the current 'active' size; you thus need to use + * @FT_Activate_Size to change it. + * + * 99% of applications won't need the functions provided here, especially + * if they use the caching sub-system, so be cautious when using these. + * + */ + + + /************************************************************************** + * + * @function: + * FT_New_Size + * + * @description: + * Create a new size object from a given face object. + * + * @input: + * face :: + * A handle to a parent face object. + * + * @output: + * asize :: + * A handle to a new size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You need to call @FT_Activate_Size in order to select the new size for + * upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, + * @FT_Load_Glyph, @FT_Load_Char, etc. + */ + FT_EXPORT( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size* size ); + + + /************************************************************************** + * + * @function: + * FT_Done_Size + * + * @description: + * Discard a given size object. Note that @FT_Done_Face automatically + * discards all size objects allocated with @FT_New_Size. + * + * @input: + * size :: + * A handle to a target size object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_Size( FT_Size size ); + + + /************************************************************************** + * + * @function: + * FT_Activate_Size + * + * @description: + * Even though it is possible to create several size objects for a given + * face (see @FT_New_Size for details), functions like @FT_Load_Glyph or + * @FT_Load_Char only use the one that has been activated last to + * determine the 'current character pixel size'. + * + * This function can be used to 'activate' a previously created size + * object. + * + * @input: + * size :: + * A handle to a target size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `face` is the size's parent face object, this function changes the + * value of `face->size` to the input size handle. + */ + FT_EXPORT( FT_Error ) + FT_Activate_Size( FT_Size size ); + + /* */ + + +FT_END_HEADER + +#endif /* FTSIZES_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftsnames.h b/NothinFancy/dep/include/freetype/ftsnames.h new file mode 100644 index 0000000..c7f6581 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftsnames.h @@ -0,0 +1,272 @@ +/**************************************************************************** + * + * ftsnames.h + * + * Simple interface to access SFNT 'name' tables (which are used + * to hold font names, copyright info, notices, etc.) (specification). + * + * This is _not_ used to retrieve glyph names! + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSNAMES_H_ +#define FTSNAMES_H_ + + +#include +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * sfnt_names + * + * @title: + * SFNT Names + * + * @abstract: + * Access the names embedded in TrueType and OpenType files. + * + * @description: + * The TrueType and OpenType specifications allow the inclusion of a + * special names table ('name') in font files. This table contains + * textual (and internationalized) information regarding the font, like + * family name, copyright, version, etc. + * + * The definitions below are used to access them if available. + * + * Note that this has nothing to do with glyph names! + * + */ + + + /************************************************************************** + * + * @struct: + * FT_SfntName + * + * @description: + * A structure used to model an SFNT 'name' table entry. + * + * @fields: + * platform_id :: + * The platform ID for `string`. See @TT_PLATFORM_XXX for possible + * values. + * + * encoding_id :: + * The encoding ID for `string`. See @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, + * @TT_ISO_ID_XXX, @TT_MS_ID_XXX, and @TT_ADOBE_ID_XXX for possible + * values. + * + * language_id :: + * The language ID for `string`. See @TT_MAC_LANGID_XXX and + * @TT_MS_LANGID_XXX for possible values. + * + * Registered OpenType values for `language_id` are always smaller than + * 0x8000; values equal or larger than 0x8000 usually indicate a + * language tag string (introduced in OpenType version 1.6). Use + * function @FT_Get_Sfnt_LangTag with `language_id` as its argument to + * retrieve the associated language tag. + * + * name_id :: + * An identifier for `string`. See @TT_NAME_ID_XXX for possible + * values. + * + * string :: + * The 'name' string. Note that its format differs depending on the + * (platform,encoding) pair, being either a string of bytes (without a + * terminating `NULL` byte) or containing UTF-16BE entities. + * + * string_len :: + * The length of `string` in bytes. + * + * @note: + * Please refer to the TrueType or OpenType specification for more + * details. + */ + typedef struct FT_SfntName_ + { + FT_UShort platform_id; + FT_UShort encoding_id; + FT_UShort language_id; + FT_UShort name_id; + + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntName; + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Name_Count + * + * @description: + * Retrieve the number of name strings in the SFNT 'name' table. + * + * @input: + * face :: + * A handle to the source face. + * + * @return: + * The number of strings in the 'name' table. + * + * @note: + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Name + * + * @description: + * Retrieve a string of the SFNT 'name' table for a given index. + * + * @input: + * face :: + * A handle to the source face. + * + * idx :: + * The index of the 'name' string. + * + * @output: + * aname :: + * The indexed @FT_SfntName structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `string` array returned in the `aname` structure is not + * null-terminated. Note that you don't have to deallocate `string` by + * yourself; FreeType takes care of it if you call @FT_Done_Face. + * + * Use @FT_Get_Sfnt_Name_Count to get the total number of available + * 'name' table entries, then do a loop until you get the right platform, + * encoding, and name ID. + * + * 'name' table format~1 entries can use language tags also, see + * @FT_Get_Sfnt_LangTag. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ); + + + /************************************************************************** + * + * @struct: + * FT_SfntLangTag + * + * @description: + * A structure to model a language tag entry from an SFNT 'name' table. + * + * @fields: + * string :: + * The language tag string, encoded in UTF-16BE (without trailing + * `NULL` bytes). + * + * string_len :: + * The length of `string` in **bytes**. + * + * @note: + * Please refer to the TrueType or OpenType specification for more + * details. + * + * @since: + * 2.8 + */ + typedef struct FT_SfntLangTag_ + { + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntLangTag; + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_LangTag + * + * @description: + * Retrieve the language tag associated with a language ID of an SFNT + * 'name' table entry. + * + * @input: + * face :: + * A handle to the source face. + * + * langID :: + * The language ID, as returned by @FT_Get_Sfnt_Name. This is always a + * value larger than 0x8000. + * + * @output: + * alangTag :: + * The language tag associated with the 'name' table entry's language + * ID. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `string` array returned in the `alangTag` structure is not + * null-terminated. Note that you don't have to deallocate `string` by + * yourself; FreeType takes care of it if you call @FT_Done_Face. + * + * Only 'name' table format~1 supports language tags. For format~0 + * tables, this function always returns FT_Err_Invalid_Table. For + * invalid format~1 language ID values, FT_Err_Invalid_Argument is + * returned. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + * + * @since: + * 2.8 + */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_LangTag( FT_Face face, + FT_UInt langID, + FT_SfntLangTag *alangTag ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTSNAMES_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftstroke.h b/NothinFancy/dep/include/freetype/ftstroke.h new file mode 100644 index 0000000..88b2a8a --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftstroke.h @@ -0,0 +1,773 @@ +/**************************************************************************** + * + * ftstroke.h + * + * FreeType path stroker (specification). + * + * Copyright (C) 2002-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSTROKE_H_ +#define FTSTROKE_H_ + +#include +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * glyph_stroker + * + * @title: + * Glyph Stroker + * + * @abstract: + * Generating bordered and stroked glyphs. + * + * @description: + * This component generates stroked outlines of a given vectorial glyph. + * It also allows you to retrieve the 'outside' and/or the 'inside' + * borders of the stroke. + * + * This can be useful to generate 'bordered' glyph, i.e., glyphs + * displayed with a colored (and anti-aliased) border around their + * shape. + * + * @order: + * FT_Stroker + * + * FT_Stroker_LineJoin + * FT_Stroker_LineCap + * FT_StrokerBorder + * + * FT_Outline_GetInsideBorder + * FT_Outline_GetOutsideBorder + * + * FT_Glyph_Stroke + * FT_Glyph_StrokeBorder + * + * FT_Stroker_New + * FT_Stroker_Set + * FT_Stroker_Rewind + * FT_Stroker_ParseOutline + * FT_Stroker_Done + * + * FT_Stroker_BeginSubPath + * FT_Stroker_EndSubPath + * + * FT_Stroker_LineTo + * FT_Stroker_ConicTo + * FT_Stroker_CubicTo + * + * FT_Stroker_GetBorderCounts + * FT_Stroker_ExportBorder + * FT_Stroker_GetCounts + * FT_Stroker_Export + * + */ + + + /************************************************************************** + * + * @type: + * FT_Stroker + * + * @description: + * Opaque handle to a path stroker object. + */ + typedef struct FT_StrokerRec_* FT_Stroker; + + + /************************************************************************** + * + * @enum: + * FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered in a + * stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used to join + * two lines smoothly. + * + * FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins. The outer corner of the joined + * lines is filled by enclosing the triangular region of the corner + * with a straight line between the outer corners of each stroke. + * + * FT_STROKER_LINEJOIN_MITER_FIXED :: + * Used to render mitered line joins, with fixed bevels if the miter + * limit is exceeded. The outer edges of the strokes for the two + * segments are extended until they meet at an angle. A bevel join + * (see above) is used if the segments meet at too sharp an angle and + * the outer edges meet beyond a distance corresponding to the meter + * limit. This prevents long spikes being created. + * `FT_STROKER_LINEJOIN_MITER_FIXED` generates a miter line join as + * used in PostScript and PDF. + * + * FT_STROKER_LINEJOIN_MITER_VARIABLE :: + * FT_STROKER_LINEJOIN_MITER :: + * Used to render mitered line joins, with variable bevels if the miter + * limit is exceeded. The intersection of the strokes is clipped + * perpendicularly to the bisector, at a distance corresponding to + * the miter limit. This prevents long spikes being created. + * `FT_STROKER_LINEJOIN_MITER_VARIABLE` generates a mitered line join + * as used in XPS. `FT_STROKER_LINEJOIN_MITER` is an alias for + * `FT_STROKER_LINEJOIN_MITER_VARIABLE`, retained for backward + * compatibility. + */ + typedef enum FT_Stroker_LineJoin_ + { + FT_STROKER_LINEJOIN_ROUND = 0, + FT_STROKER_LINEJOIN_BEVEL = 1, + FT_STROKER_LINEJOIN_MITER_VARIABLE = 2, + FT_STROKER_LINEJOIN_MITER = FT_STROKER_LINEJOIN_MITER_VARIABLE, + FT_STROKER_LINEJOIN_MITER_FIXED = 3 + + } FT_Stroker_LineJoin; + + + /************************************************************************** + * + * @enum: + * FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are rendered in + * a stroke. + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last point + * itself. + * + * FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the last point. + * + * FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the last point. + */ + typedef enum FT_Stroker_LineCap_ + { + FT_STROKER_LINECAP_BUTT = 0, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINECAP_SQUARE + + } FT_Stroker_LineCap; + + + /************************************************************************** + * + * @enum: + * FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border in + * @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. + * + * @values: + * FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the 'inside' and 'outside' + * borders. However, there is no direct mapping between these and the + * 'left' and 'right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @FT_Outline_GetInsideBorder and + * @FT_Outline_GetOutsideBorder to get these. + */ + typedef enum FT_StrokerBorder_ + { + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT + + } FT_StrokerBorder; + + + /************************************************************************** + * + * @function: + * FT_Outline_GetInsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the 'inside' + * borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_GetOutsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the 'outside' + * borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * library :: + * FreeType library handle. + * + * @output: + * astroker :: + * A new stroker object handle. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The maximum reciprocal sine of half-angle at the miter join, + * expressed as 16.16 fixed point value. + * + * @note: + * The `radius` is expressed in the same units as the outline + * coordinates. + * + * The `miter_limit` multiplied by the `radius` gives the maximum size + * of a miter spike, at which it is clipped for + * @FT_STROKER_LINEJOIN_MITER_VARIABLE or replaced with a bevel join for + * @FT_STROKER_LINEJOIN_MITER_FIXED. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Rewind + * + * @description: + * Reset a stroker object without changing its attributes. You should + * call this function before beginning a new series of calls to + * @FT_Stroker_BeginSubPath or @FT_Stroker_EndSubPath. + * + * @input: + * stroker :: + * The target stroker handle. + */ + FT_EXPORT( void ) + FT_Stroker_Rewind( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with the stroker. + * The resulting outline(s) can be retrieved later by functions like + * @FT_Stroker_GetCounts and @FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If~1, the outline is treated as an open path instead of + * a closed one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `opened` is~0 (the default), the outline is treated as a closed + * path, and the stroker generates two distinct 'border' outlines. + * + * If `opened` is~1, the outline is processed as an open path, and the + * stroker generates a single 'stroke' outline. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_BeginSubPath + * + * @description: + * Start a new sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the start vector. + * + * open :: + * A boolean. If~1, the sub-path is treated as an open one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is useful when you need to stroke a path that is not + * stored as an @FT_Outline object. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_EndSubPath + * + * @description: + * Close the current sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function after @FT_Stroker_BeginSubPath. If the + * subpath was not 'opened', this function 'draws' a single line segment + * to the start position when needed. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_LineTo + * + * @description: + * 'Draw' a single line segment in the stroker's current sub-path, from + * the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ConicTo + * + * @description: + * 'Draw' a single quadratic Bezier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control :: + * A pointer to a Bezier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_CubicTo + * + * @description: + * 'Draw' a single cubic Bezier in the stroker's current sub-path, from + * the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control1 :: + * A pointer to the first Bezier control point. + * + * control2 :: + * A pointer to second Bezier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_GetBorderCounts + * + * @description: + * Call this function once you have finished parsing your paths with the + * stroker. It returns the number of points and contours necessary to + * export one of the 'border' or 'stroke' outlines generated by the + * stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * When an outline, or a sub-path, is 'closed', the stroker generates two + * independent 'border' outlines, named 'left' and 'right'. + * + * When the outline, or a sub-path, is 'opened', the stroker merges the + * 'border' outlines with caps. The 'left' border receives all points, + * while the 'right' border becomes empty. + * + * Use the function @FT_Stroker_GetCounts instead if you want to retrieve + * the counts associated to both borders. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ExportBorder + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to export the + * corresponding border to your own @FT_Outline structure. + * + * Note that this function appends the border points and contours to your + * outline, but does not try to resize its arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * outline :: + * The target outline handle. + * + * @note: + * Always call this function after @FT_Stroker_GetBorderCounts to get + * sure that there is enough room in your @FT_Outline object to receive + * all new data. + * + * When an outline, or a sub-path, is 'closed', the stroker generates two + * independent 'border' outlines, named 'left' and 'right'. + * + * When the outline, or a sub-path, is 'opened', the stroker merges the + * 'border' outlines with caps. The 'left' border receives all points, + * while the 'right' border becomes empty. + * + * Use the function @FT_Stroker_Export instead if you want to retrieve + * all borders at once. + */ + FT_EXPORT( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths with the + * stroker. It returns the number of points and contours necessary to + * export all points/borders from the stroked outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Export + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to export all + * borders to your own @FT_Outline structure. + * + * Note that this function appends the border points and contours to your + * outline, but does not try to resize its arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ + FT_EXPORT( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be `NULL`. + */ + FT_EXPORT( void ) + FT_Stroker_Done( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Stroke + * + * @description: + * Stroke a given outline glyph object with a given stroker. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + * + * Adding stroke may yield a significantly wider and taller glyph + * depending on how large of a radius was used to stroke the glyph. You + * may need to manually adjust horizontal and vertical advance amounts to + * account for this added size. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_StrokeBorder + * + * @description: + * Stroke a given outline glyph object with a given stroker, but only + * return either its inside or outside border. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * inside :: + * A Boolean. If~1, return the inside border, otherwise the outside + * border. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + * + * Adding stroke may yield a significantly wider and taller glyph + * depending on how large of a radius was used to stroke the glyph. You + * may need to manually adjust horizontal and vertical advance amounts to + * account for this added size. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ); + + /* */ + +FT_END_HEADER + +#endif /* FTSTROKE_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/NothinFancy/dep/include/freetype/ftsynth.h b/NothinFancy/dep/include/freetype/ftsynth.h new file mode 100644 index 0000000..861dcb5 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftsynth.h @@ -0,0 +1,83 @@ +/**************************************************************************** + * + * ftsynth.h + * + * FreeType synthesizing code for emboldening and slanting + * (specification). + * + * Copyright (C) 2000-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS ALPHA CODE! THIS API *********/ + /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ + /********* FREETYPE DEVELOPMENT TEAM *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Main reason for not lifting the functions in this module to a */ + /* 'standard' API is that the used parameters for emboldening and */ + /* slanting are not configurable. Consider the functions as a */ + /* code resource that should be copied into the application and */ + /* adapted to the particular needs. */ + + +#ifndef FTSYNTH_H_ +#define FTSYNTH_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /* Embolden a glyph by a 'reasonable' value (which is highly a matter of */ + /* taste). This function is actually a convenience function, providing */ + /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */ + /* */ + /* For emboldened outlines the height, width, and advance metrics are */ + /* increased by the strength of the emboldening -- this even affects */ + /* mono-width fonts! */ + /* */ + /* You can also call @FT_Outline_Get_CBox to get precise values. */ + FT_EXPORT( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + + /* Slant an outline glyph to the right by about 12 degrees. */ + FT_EXPORT( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); + + /* */ + + +FT_END_HEADER + +#endif /* FTSYNTH_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftsystem.h b/NothinFancy/dep/include/freetype/ftsystem.h new file mode 100644 index 0000000..e5abb85 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftsystem.h @@ -0,0 +1,352 @@ +/**************************************************************************** + * + * ftsystem.h + * + * FreeType low-level system interface definition (specification). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSYSTEM_H_ +#define FTSYSTEM_H_ + + + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * system_interface + * + * @title: + * System Interface + * + * @abstract: + * How FreeType manages memory and i/o. + * + * @description: + * This section contains various definitions related to memory management + * and i/o access. You need to understand this information if you want to + * use a custom memory manager or you own i/o streams. + * + */ + + + /************************************************************************** + * + * M E M O R Y M A N A G E M E N T + * + */ + + + /************************************************************************** + * + * @type: + * FT_Memory + * + * @description: + * A handle to a given memory manager object, defined with an + * @FT_MemoryRec structure. + * + */ + typedef struct FT_MemoryRec_* FT_Memory; + + + /************************************************************************** + * + * @functype: + * FT_Alloc_Func + * + * @description: + * A function used to allocate `size` bytes from `memory`. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * size :: + * The size in bytes to allocate. + * + * @return: + * Address of new memory block. 0~in case of failure. + * + */ + typedef void* + (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + + /************************************************************************** + * + * @functype: + * FT_Free_Func + * + * @description: + * A function used to release a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * block :: + * The address of the target memory block. + * + */ + typedef void + (*FT_Free_Func)( FT_Memory memory, + void* block ); + + + /************************************************************************** + * + * @functype: + * FT_Realloc_Func + * + * @description: + * A function used to re-allocate a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * cur_size :: + * The block's current size in bytes. + * + * new_size :: + * The block's requested new size. + * + * block :: + * The block's current address. + * + * @return: + * New block address. 0~in case of memory shortage. + * + * @note: + * In case of error, the old block must still be available. + * + */ + typedef void* + (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + + /************************************************************************** + * + * @struct: + * FT_MemoryRec + * + * @description: + * A structure used to describe a given memory manager to FreeType~2. + * + * @fields: + * user :: + * A generic typeless pointer for user data. + * + * alloc :: + * A pointer type to an allocation function. + * + * free :: + * A pointer type to an memory freeing function. + * + * realloc :: + * A pointer type to a reallocation function. + * + */ + struct FT_MemoryRec_ + { + void* user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + }; + + + /************************************************************************** + * + * I / O M A N A G E M E N T + * + */ + + + /************************************************************************** + * + * @type: + * FT_Stream + * + * @description: + * A handle to an input stream. + * + * @also: + * See @FT_StreamRec for the publicly accessible fields of a given stream + * object. + * + */ + typedef struct FT_StreamRec_* FT_Stream; + + + /************************************************************************** + * + * @struct: + * FT_StreamDesc + * + * @description: + * A union type used to store either a long or a pointer. This is used + * to store a file descriptor or a `FILE*` in an input stream. + * + */ + typedef union FT_StreamDesc_ + { + long value; + void* pointer; + + } FT_StreamDesc; + + + /************************************************************************** + * + * @functype: + * FT_Stream_IoFunc + * + * @description: + * A function used to seek and read data from a given input stream. + * + * @input: + * stream :: + * A handle to the source stream. + * + * offset :: + * The offset of read in stream (always from start). + * + * buffer :: + * The address of the read buffer. + * + * count :: + * The number of bytes to read from the stream. + * + * @return: + * The number of bytes effectively read by the stream. + * + * @note: + * This function might be called to perform a seek or skip operation with + * a `count` of~0. A non-zero return value then indicates an error. + * + */ + typedef unsigned long + (*FT_Stream_IoFunc)( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ); + + + /************************************************************************** + * + * @functype: + * FT_Stream_CloseFunc + * + * @description: + * A function used to close a given input stream. + * + * @input: + * stream :: + * A handle to the target stream. + * + */ + typedef void + (*FT_Stream_CloseFunc)( FT_Stream stream ); + + + /************************************************************************** + * + * @struct: + * FT_StreamRec + * + * @description: + * A structure used to describe an input stream. + * + * @input: + * base :: + * For memory-based streams, this is the address of the first stream + * byte in memory. This field should always be set to `NULL` for + * disk-based streams. + * + * size :: + * The stream size in bytes. + * + * In case of compressed streams where the size is unknown before + * actually doing the decompression, the value is set to 0x7FFFFFFF. + * (Note that this size value can occur for normal streams also; it is + * thus just a hint.) + * + * pos :: + * The current position within the stream. + * + * descriptor :: + * This field is a union that can hold an integer or a pointer. It is + * used by stream implementations to store file descriptors or `FILE*` + * pointers. + * + * pathname :: + * This field is completely ignored by FreeType. However, it is often + * useful during debugging to use it to store the stream's filename + * (where available). + * + * read :: + * The stream's input function. + * + * close :: + * The stream's close function. + * + * memory :: + * The memory manager to use to preload frames. This is set internally + * by FreeType and shouldn't be touched by stream implementations. + * + * cursor :: + * This field is set and used internally by FreeType when parsing + * frames. In particular, the `FT_GET_XXX` macros use this instead of + * the `pos` field. + * + * limit :: + * This field is set and used internally by FreeType when parsing + * frames. + * + */ + typedef struct FT_StreamRec_ + { + unsigned char* base; + unsigned long size; + unsigned long pos; + + FT_StreamDesc descriptor; + FT_StreamDesc pathname; + FT_Stream_IoFunc read; + FT_Stream_CloseFunc close; + + FT_Memory memory; + unsigned char* cursor; + unsigned char* limit; + + } FT_StreamRec; + + /* */ + + +FT_END_HEADER + +#endif /* FTSYSTEM_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/fttrigon.h b/NothinFancy/dep/include/freetype/fttrigon.h new file mode 100644 index 0000000..dbe7b0d --- /dev/null +++ b/NothinFancy/dep/include/freetype/fttrigon.h @@ -0,0 +1,350 @@ +/**************************************************************************** + * + * fttrigon.h + * + * FreeType trigonometric functions (specification). + * + * Copyright (C) 2001-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTTRIGON_H_ +#define FTTRIGON_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * computations + * + */ + + + /************************************************************************** + * + * @type: + * FT_Angle + * + * @description: + * This type is used to model angle values in FreeType. Note that the + * angle is a 16.16 fixed-point value expressed in degrees. + * + */ + typedef FT_Fixed FT_Angle; + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI + * + * @description: + * The angle pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI ( 180L << 16 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_2PI + * + * @description: + * The angle 2*pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI2 + * + * @description: + * The angle pi/2 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI4 + * + * @description: + * The angle pi/4 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) + + + /************************************************************************** + * + * @function: + * FT_Sin + * + * @description: + * Return the sinus of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The sinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Sin( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Cos + * + * @description: + * Return the cosinus of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The cosinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Cos( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Tan + * + * @description: + * Return the tangent of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The tangent value. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Tan( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Atan2 + * + * @description: + * Return the arc-tangent corresponding to a given vector (x,y) in the 2d + * plane. + * + * @input: + * x :: + * The horizontal vector coordinate. + * + * y :: + * The vertical vector coordinate. + * + * @return: + * The arc-tangent value (i.e. angle). + * + */ + FT_EXPORT( FT_Angle ) + FT_Atan2( FT_Fixed x, + FT_Fixed y ); + + + /************************************************************************** + * + * @function: + * FT_Angle_Diff + * + * @description: + * Return the difference between two angles. The result is always + * constrained to the ]-PI..PI] interval. + * + * @input: + * angle1 :: + * First angle. + * + * angle2 :: + * Second angle. + * + * @return: + * Constrained value of `angle2-angle1`. + * + */ + FT_EXPORT( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Unit + * + * @description: + * Return the unit vector corresponding to a given angle. After the + * call, the value of `vec.x` will be `cos(angle)`, and the value of + * `vec.y` will be `sin(angle)`. + * + * This function is useful to retrieve both the sinus and cosinus of a + * given angle quickly. + * + * @output: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The input angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Rotate + * + * @description: + * Rotate a vector by a given angle. + * + * @inout: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The input angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Length + * + * @description: + * Return the length of a given vector. + * + * @input: + * vec :: + * The address of target vector. + * + * @return: + * The vector length, expressed in the same units that the original + * vector coordinates. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Polarize + * + * @description: + * Compute both the length and angle of a given vector. + * + * @input: + * vec :: + * The address of source vector. + * + * @output: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_From_Polar + * + * @description: + * Compute vector coordinates from a length and angle. + * + * @output: + * vec :: + * The address of source vector. + * + * @input: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ); + + /* */ + + +FT_END_HEADER + +#endif /* FTTRIGON_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/fttypes.h b/NothinFancy/dep/include/freetype/fttypes.h new file mode 100644 index 0000000..d5ca1c4 --- /dev/null +++ b/NothinFancy/dep/include/freetype/fttypes.h @@ -0,0 +1,615 @@ +/**************************************************************************** + * + * fttypes.h + * + * FreeType simple types definitions (specification only). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTTYPES_H_ +#define FTTYPES_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include +#include + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * basic_types + * + * @title: + * Basic Data Types + * + * @abstract: + * The basic data types defined by the library. + * + * @description: + * This section contains the basic data types defined by FreeType~2, + * ranging from simple scalar types to bitmap descriptors. More + * font-specific structures are defined in a different section. + * + * @order: + * FT_Byte + * FT_Bytes + * FT_Char + * FT_Int + * FT_UInt + * FT_Int16 + * FT_UInt16 + * FT_Int32 + * FT_UInt32 + * FT_Int64 + * FT_UInt64 + * FT_Short + * FT_UShort + * FT_Long + * FT_ULong + * FT_Bool + * FT_Offset + * FT_PtrDist + * FT_String + * FT_Tag + * FT_Error + * FT_Fixed + * FT_Pointer + * FT_Pos + * FT_Vector + * FT_BBox + * FT_Matrix + * FT_FWord + * FT_UFWord + * FT_F2Dot14 + * FT_UnitVector + * FT_F26Dot6 + * FT_Data + * + * FT_MAKE_TAG + * + * FT_Generic + * FT_Generic_Finalizer + * + * FT_Bitmap + * FT_Pixel_Mode + * FT_Palette_Mode + * FT_Glyph_Format + * FT_IMAGE_TAG + * + */ + + + /************************************************************************** + * + * @type: + * FT_Bool + * + * @description: + * A typedef of unsigned char, used for simple booleans. As usual, + * values 1 and~0 represent true and false, respectively. + */ + typedef unsigned char FT_Bool; + + + /************************************************************************** + * + * @type: + * FT_FWord + * + * @description: + * A signed 16-bit integer used to store a distance in original font + * units. + */ + typedef signed short FT_FWord; /* distance in FUnits */ + + + /************************************************************************** + * + * @type: + * FT_UFWord + * + * @description: + * An unsigned 16-bit integer used to store a distance in original font + * units. + */ + typedef unsigned short FT_UFWord; /* unsigned distance */ + + + /************************************************************************** + * + * @type: + * FT_Char + * + * @description: + * A simple typedef for the _signed_ char type. + */ + typedef signed char FT_Char; + + + /************************************************************************** + * + * @type: + * FT_Byte + * + * @description: + * A simple typedef for the _unsigned_ char type. + */ + typedef unsigned char FT_Byte; + + + /************************************************************************** + * + * @type: + * FT_Bytes + * + * @description: + * A typedef for constant memory areas. + */ + typedef const FT_Byte* FT_Bytes; + + + /************************************************************************** + * + * @type: + * FT_Tag + * + * @description: + * A typedef for 32-bit tags (as used in the SFNT format). + */ + typedef FT_UInt32 FT_Tag; + + + /************************************************************************** + * + * @type: + * FT_String + * + * @description: + * A simple typedef for the char type, usually used for strings. + */ + typedef char FT_String; + + + /************************************************************************** + * + * @type: + * FT_Short + * + * @description: + * A typedef for signed short. + */ + typedef signed short FT_Short; + + + /************************************************************************** + * + * @type: + * FT_UShort + * + * @description: + * A typedef for unsigned short. + */ + typedef unsigned short FT_UShort; + + + /************************************************************************** + * + * @type: + * FT_Int + * + * @description: + * A typedef for the int type. + */ + typedef signed int FT_Int; + + + /************************************************************************** + * + * @type: + * FT_UInt + * + * @description: + * A typedef for the unsigned int type. + */ + typedef unsigned int FT_UInt; + + + /************************************************************************** + * + * @type: + * FT_Long + * + * @description: + * A typedef for signed long. + */ + typedef signed long FT_Long; + + + /************************************************************************** + * + * @type: + * FT_ULong + * + * @description: + * A typedef for unsigned long. + */ + typedef unsigned long FT_ULong; + + + /************************************************************************** + * + * @type: + * FT_F2Dot14 + * + * @description: + * A signed 2.14 fixed-point type used for unit vectors. + */ + typedef signed short FT_F2Dot14; + + + /************************************************************************** + * + * @type: + * FT_F26Dot6 + * + * @description: + * A signed 26.6 fixed-point type used for vectorial pixel coordinates. + */ + typedef signed long FT_F26Dot6; + + + /************************************************************************** + * + * @type: + * FT_Fixed + * + * @description: + * This type is used to store 16.16 fixed-point values, like scaling + * values or matrix coefficients. + */ + typedef signed long FT_Fixed; + + + /************************************************************************** + * + * @type: + * FT_Error + * + * @description: + * The FreeType error code type. A value of~0 is always interpreted as a + * successful operation. + */ + typedef int FT_Error; + + + /************************************************************************** + * + * @type: + * FT_Pointer + * + * @description: + * A simple typedef for a typeless pointer. + */ + typedef void* FT_Pointer; + + + /************************************************************************** + * + * @type: + * FT_Offset + * + * @description: + * This is equivalent to the ANSI~C `size_t` type, i.e., the largest + * _unsigned_ integer type used to express a file size or position, or a + * memory block size. + */ + typedef size_t FT_Offset; + + + /************************************************************************** + * + * @type: + * FT_PtrDist + * + * @description: + * This is equivalent to the ANSI~C `ptrdiff_t` type, i.e., the largest + * _signed_ integer type used to express the distance between two + * pointers. + */ + typedef ft_ptrdiff_t FT_PtrDist; + + + /************************************************************************** + * + * @struct: + * FT_UnitVector + * + * @description: + * A simple structure used to store a 2D vector unit vector. Uses + * FT_F2Dot14 types. + * + * @fields: + * x :: + * Horizontal coordinate. + * + * y :: + * Vertical coordinate. + */ + typedef struct FT_UnitVector_ + { + FT_F2Dot14 x; + FT_F2Dot14 y; + + } FT_UnitVector; + + + /************************************************************************** + * + * @struct: + * FT_Matrix + * + * @description: + * A simple structure used to store a 2x2 matrix. Coefficients are in + * 16.16 fixed-point format. The computation performed is: + * + * ``` + * x' = x*xx + y*xy + * y' = x*yx + y*yy + * ``` + * + * @fields: + * xx :: + * Matrix coefficient. + * + * xy :: + * Matrix coefficient. + * + * yx :: + * Matrix coefficient. + * + * yy :: + * Matrix coefficient. + */ + typedef struct FT_Matrix_ + { + FT_Fixed xx, xy; + FT_Fixed yx, yy; + + } FT_Matrix; + + + /************************************************************************** + * + * @struct: + * FT_Data + * + * @description: + * Read-only binary data represented as a pointer and a length. + * + * @fields: + * pointer :: + * The data. + * + * length :: + * The length of the data in bytes. + */ + typedef struct FT_Data_ + { + const FT_Byte* pointer; + FT_Int length; + + } FT_Data; + + + /************************************************************************** + * + * @functype: + * FT_Generic_Finalizer + * + * @description: + * Describe a function used to destroy the 'client' data of any FreeType + * object. See the description of the @FT_Generic type for details of + * usage. + * + * @input: + * The address of the FreeType object that is under finalization. Its + * client data is accessed through its `generic` field. + */ + typedef void (*FT_Generic_Finalizer)( void* object ); + + + /************************************************************************** + * + * @struct: + * FT_Generic + * + * @description: + * Client applications often need to associate their own data to a + * variety of FreeType core objects. For example, a text layout API + * might want to associate a glyph cache to a given size object. + * + * Some FreeType object contains a `generic` field, of type `FT_Generic`, + * which usage is left to client applications and font servers. + * + * It can be used to store a pointer to client-specific data, as well as + * the address of a 'finalizer' function, which will be called by + * FreeType when the object is destroyed (for example, the previous + * client example would put the address of the glyph cache destructor in + * the `finalizer` field). + * + * @fields: + * data :: + * A typeless pointer to any client-specified data. This field is + * completely ignored by the FreeType library. + * + * finalizer :: + * A pointer to a 'generic finalizer' function, which will be called + * when the object is destroyed. If this field is set to `NULL`, no + * code will be called. + */ + typedef struct FT_Generic_ + { + void* data; + FT_Generic_Finalizer finalizer; + + } FT_Generic; + + + /************************************************************************** + * + * @macro: + * FT_MAKE_TAG + * + * @description: + * This macro converts four-letter tags that are used to label TrueType + * tables into an unsigned long, to be used within FreeType. + * + * @note: + * The produced values **must** be 32-bit integers. Don't redefine this + * macro. + */ +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + (FT_Tag) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* L I S T M A N A G E M E N T */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * list_processing + * + */ + + + /************************************************************************** + * + * @type: + * FT_ListNode + * + * @description: + * Many elements and objects in FreeType are listed through an @FT_List + * record (see @FT_ListRec). As its name suggests, an FT_ListNode is a + * handle to a single list element. + */ + typedef struct FT_ListNodeRec_* FT_ListNode; + + + /************************************************************************** + * + * @type: + * FT_List + * + * @description: + * A handle to a list record (see @FT_ListRec). + */ + typedef struct FT_ListRec_* FT_List; + + + /************************************************************************** + * + * @struct: + * FT_ListNodeRec + * + * @description: + * A structure used to hold a single list element. + * + * @fields: + * prev :: + * The previous element in the list. `NULL` if first. + * + * next :: + * The next element in the list. `NULL` if last. + * + * data :: + * A typeless pointer to the listed object. + */ + typedef struct FT_ListNodeRec_ + { + FT_ListNode prev; + FT_ListNode next; + void* data; + + } FT_ListNodeRec; + + + /************************************************************************** + * + * @struct: + * FT_ListRec + * + * @description: + * A structure used to hold a simple doubly-linked list. These are used + * in many parts of FreeType. + * + * @fields: + * head :: + * The head (first element) of doubly-linked list. + * + * tail :: + * The tail (last element) of doubly-linked list. + */ + typedef struct FT_ListRec_ + { + FT_ListNode head; + FT_ListNode tail; + + } FT_ListRec; + + /* */ + + +#define FT_IS_EMPTY( list ) ( (list).head == 0 ) +#define FT_BOOL( x ) ( (FT_Bool)( (x) != 0 ) ) + + /* concatenate C tokens */ +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + /* see `ftmoderr.h` for descriptions of the following macros */ + +#define FT_ERR( e ) FT_ERR_CAT( FT_ERR_PREFIX, e ) + +#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) +#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) + +#define FT_ERR_EQ( x, e ) \ + ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) ) +#define FT_ERR_NEQ( x, e ) \ + ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) ) + + +FT_END_HEADER + +#endif /* FTTYPES_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ftwinfnt.h b/NothinFancy/dep/include/freetype/ftwinfnt.h new file mode 100644 index 0000000..b1ef3b6 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ftwinfnt.h @@ -0,0 +1,276 @@ +/**************************************************************************** + * + * ftwinfnt.h + * + * FreeType API for accessing Windows fnt-specific data. + * + * Copyright (C) 2003-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTWINFNT_H_ +#define FTWINFNT_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * winfnt_fonts + * + * @title: + * Window FNT Files + * + * @abstract: + * Windows FNT-specific API. + * + * @description: + * This section contains the declaration of Windows FNT-specific + * functions. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_WinFNT_ID_XXX + * + * @description: + * A list of valid values for the `charset` byte in @FT_WinFNT_HeaderRec. + * Exact mapping tables for the various 'cpXXXX' encodings (except for + * 'cp1361') can be found at 'ftp://ftp.unicode.org/Public/' in the + * `MAPPINGS/VENDORS/MICSFT/WINDOWS` subdirectory. 'cp1361' is roughly a + * superset of `MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT`. + * + * @values: + * FT_WinFNT_ID_DEFAULT :: + * This is used for font enumeration and font creation as a 'don't + * care' value. Valid font files don't contain this value. When + * querying for information about the character set of the font that is + * currently selected into a specified device context, this return + * value (of the related Windows API) simply denotes failure. + * + * FT_WinFNT_ID_SYMBOL :: + * There is no known mapping table available. + * + * FT_WinFNT_ID_MAC :: + * Mac Roman encoding. + * + * FT_WinFNT_ID_OEM :: + * From Michael Poettgen : + * + * The 'Windows Font Mapping' article says that `FT_WinFNT_ID_OEM` is + * used for the charset of vector fonts, like `modern.fon`, + * `roman.fon`, and `script.fon` on Windows. + * + * The 'CreateFont' documentation says: The `FT_WinFNT_ID_OEM` value + * specifies a character set that is operating-system dependent. + * + * The 'IFIMETRICS' documentation from the 'Windows Driver Development + * Kit' says: This font supports an OEM-specific character set. The + * OEM character set is system dependent. + * + * In general OEM, as opposed to ANSI (i.e., 'cp1252'), denotes the + * second default codepage that most international versions of Windows + * have. It is one of the OEM codepages from + * + * https://docs.microsoft.com/en-us/windows/desktop/intl/code-page-identifiers + * , + * + * and is used for the 'DOS boxes', to support legacy applications. A + * German Windows version for example usually uses ANSI codepage 1252 + * and OEM codepage 850. + * + * FT_WinFNT_ID_CP874 :: + * A superset of Thai TIS 620 and ISO 8859-11. + * + * FT_WinFNT_ID_CP932 :: + * A superset of Japanese Shift-JIS (with minor deviations). + * + * FT_WinFNT_ID_CP936 :: + * A superset of simplified Chinese GB 2312-1980 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP949 :: + * A superset of Korean Hangul KS~C 5601-1987 (with different ordering + * and minor deviations). + * + * FT_WinFNT_ID_CP950 :: + * A superset of traditional Chinese Big~5 ETen (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP1250 :: + * A superset of East European ISO 8859-2 (with slightly different + * ordering). + * + * FT_WinFNT_ID_CP1251 :: + * A superset of Russian ISO 8859-5 (with different ordering). + * + * FT_WinFNT_ID_CP1252 :: + * ANSI encoding. A superset of ISO 8859-1. + * + * FT_WinFNT_ID_CP1253 :: + * A superset of Greek ISO 8859-7 (with minor modifications). + * + * FT_WinFNT_ID_CP1254 :: + * A superset of Turkish ISO 8859-9. + * + * FT_WinFNT_ID_CP1255 :: + * A superset of Hebrew ISO 8859-8 (with some modifications). + * + * FT_WinFNT_ID_CP1256 :: + * A superset of Arabic ISO 8859-6 (with different ordering). + * + * FT_WinFNT_ID_CP1257 :: + * A superset of Baltic ISO 8859-13 (with some deviations). + * + * FT_WinFNT_ID_CP1258 :: + * For Vietnamese. This encoding doesn't cover all necessary + * characters. + * + * FT_WinFNT_ID_CP1361 :: + * Korean (Johab). + */ + +#define FT_WinFNT_ID_CP1252 0 +#define FT_WinFNT_ID_DEFAULT 1 +#define FT_WinFNT_ID_SYMBOL 2 +#define FT_WinFNT_ID_MAC 77 +#define FT_WinFNT_ID_CP932 128 +#define FT_WinFNT_ID_CP949 129 +#define FT_WinFNT_ID_CP1361 130 +#define FT_WinFNT_ID_CP936 134 +#define FT_WinFNT_ID_CP950 136 +#define FT_WinFNT_ID_CP1253 161 +#define FT_WinFNT_ID_CP1254 162 +#define FT_WinFNT_ID_CP1258 163 +#define FT_WinFNT_ID_CP1255 177 +#define FT_WinFNT_ID_CP1256 178 +#define FT_WinFNT_ID_CP1257 186 +#define FT_WinFNT_ID_CP1251 204 +#define FT_WinFNT_ID_CP874 222 +#define FT_WinFNT_ID_CP1250 238 +#define FT_WinFNT_ID_OEM 255 + + + /************************************************************************** + * + * @struct: + * FT_WinFNT_HeaderRec + * + * @description: + * Windows FNT Header info. + */ + typedef struct FT_WinFNT_HeaderRec_ + { + FT_UShort version; + FT_ULong file_size; + FT_Byte copyright[60]; + FT_UShort file_type; + FT_UShort nominal_point_size; + FT_UShort vertical_resolution; + FT_UShort horizontal_resolution; + FT_UShort ascent; + FT_UShort internal_leading; + FT_UShort external_leading; + FT_Byte italic; + FT_Byte underline; + FT_Byte strike_out; + FT_UShort weight; + FT_Byte charset; + FT_UShort pixel_width; + FT_UShort pixel_height; + FT_Byte pitch_and_family; + FT_UShort avg_width; + FT_UShort max_width; + FT_Byte first_char; + FT_Byte last_char; + FT_Byte default_char; + FT_Byte break_char; + FT_UShort bytes_per_row; + FT_ULong device_offset; + FT_ULong face_name_offset; + FT_ULong bits_pointer; + FT_ULong bits_offset; + FT_Byte reserved; + FT_ULong flags; + FT_UShort A_space; + FT_UShort B_space; + FT_UShort C_space; + FT_UShort color_table_offset; + FT_ULong reserved1[4]; + + } FT_WinFNT_HeaderRec; + + + /************************************************************************** + * + * @struct: + * FT_WinFNT_Header + * + * @description: + * A handle to an @FT_WinFNT_HeaderRec structure. + */ + typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header; + + + /************************************************************************** + * + * @function: + * FT_Get_WinFNT_Header + * + * @description: + * Retrieve a Windows FNT font info header. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * aheader :: + * The WinFNT header. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with Windows FNT faces, returning an error + * otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + /* */ + + +FT_END_HEADER + +#endif /* FTWINFNT_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/NothinFancy/dep/include/freetype/t1tables.h b/NothinFancy/dep/include/freetype/t1tables.h new file mode 100644 index 0000000..546ec1c --- /dev/null +++ b/NothinFancy/dep/include/freetype/t1tables.h @@ -0,0 +1,773 @@ +/**************************************************************************** + * + * t1tables.h + * + * Basic Type 1/Type 2 tables definitions and interface (specification + * only). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1TABLES_H_ +#define T1TABLES_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * type1_tables + * + * @title: + * Type 1 Tables + * + * @abstract: + * Type~1-specific font tables. + * + * @description: + * This section contains the definition of Type~1-specific tables, + * including structures related to other PostScript font formats. + * + * @order: + * PS_FontInfoRec + * PS_FontInfo + * PS_PrivateRec + * PS_Private + * + * CID_FaceDictRec + * CID_FaceDict + * CID_FaceInfoRec + * CID_FaceInfo + * + * FT_Has_PS_Glyph_Names + * FT_Get_PS_Font_Info + * FT_Get_PS_Font_Private + * FT_Get_PS_Font_Value + * + * T1_Blend_Flags + * T1_EncodingType + * PS_Dict_Keys + * + */ + + + /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ + /* structures in order to support Multiple Master fonts. */ + + + /************************************************************************** + * + * @struct: + * PS_FontInfoRec + * + * @description: + * A structure used to model a Type~1 or Type~2 FontInfo dictionary. + * Note that for Multiple Master fonts, each instance has its own + * FontInfo dictionary. + */ + typedef struct PS_FontInfoRec_ + { + FT_String* version; + FT_String* notice; + FT_String* full_name; + FT_String* family_name; + FT_String* weight; + FT_Long italic_angle; + FT_Bool is_fixed_pitch; + FT_Short underline_position; + FT_UShort underline_thickness; + + } PS_FontInfoRec; + + + /************************************************************************** + * + * @struct: + * PS_FontInfo + * + * @description: + * A handle to a @PS_FontInfoRec structure. + */ + typedef struct PS_FontInfoRec_* PS_FontInfo; + + + /************************************************************************** + * + * @struct: + * T1_FontInfo + * + * @description: + * This type is equivalent to @PS_FontInfoRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef PS_FontInfoRec T1_FontInfo; + + + /************************************************************************** + * + * @struct: + * PS_PrivateRec + * + * @description: + * A structure used to model a Type~1 or Type~2 private dictionary. Note + * that for Multiple Master fonts, each instance has its own Private + * dictionary. + */ + typedef struct PS_PrivateRec_ + { + FT_Int unique_id; + FT_Int lenIV; + + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Short blue_values[14]; + FT_Short other_blues[10]; + + FT_Short family_blues [14]; + FT_Short family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_fuzz; + + FT_UShort standard_width[1]; + FT_UShort standard_height[1]; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Bool force_bold; + FT_Bool round_stem_up; + + FT_Short snap_widths [13]; /* including std width */ + FT_Short snap_heights[13]; /* including std height */ + + FT_Fixed expansion_factor; + + FT_Long language_group; + FT_Long password; + + FT_Short min_feature[2]; + + } PS_PrivateRec; + + + /************************************************************************** + * + * @struct: + * PS_Private + * + * @description: + * A handle to a @PS_PrivateRec structure. + */ + typedef struct PS_PrivateRec_* PS_Private; + + + /************************************************************************** + * + * @struct: + * T1_Private + * + * @description: + * This type is equivalent to @PS_PrivateRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef PS_PrivateRec T1_Private; + + + /************************************************************************** + * + * @enum: + * T1_Blend_Flags + * + * @description: + * A set of flags used to indicate which fields are present in a given + * blend dictionary (font info or private). Used to support Multiple + * Masters fonts. + * + * @values: + * T1_BLEND_UNDERLINE_POSITION :: + * T1_BLEND_UNDERLINE_THICKNESS :: + * T1_BLEND_ITALIC_ANGLE :: + * T1_BLEND_BLUE_VALUES :: + * T1_BLEND_OTHER_BLUES :: + * T1_BLEND_STANDARD_WIDTH :: + * T1_BLEND_STANDARD_HEIGHT :: + * T1_BLEND_STEM_SNAP_WIDTHS :: + * T1_BLEND_STEM_SNAP_HEIGHTS :: + * T1_BLEND_BLUE_SCALE :: + * T1_BLEND_BLUE_SHIFT :: + * T1_BLEND_FAMILY_BLUES :: + * T1_BLEND_FAMILY_OTHER_BLUES :: + * T1_BLEND_FORCE_BOLD :: + */ + typedef enum T1_Blend_Flags_ + { + /* required fields in a FontInfo blend dictionary */ + T1_BLEND_UNDERLINE_POSITION = 0, + T1_BLEND_UNDERLINE_THICKNESS, + T1_BLEND_ITALIC_ANGLE, + + /* required fields in a Private blend dictionary */ + T1_BLEND_BLUE_VALUES, + T1_BLEND_OTHER_BLUES, + T1_BLEND_STANDARD_WIDTH, + T1_BLEND_STANDARD_HEIGHT, + T1_BLEND_STEM_SNAP_WIDTHS, + T1_BLEND_STEM_SNAP_HEIGHTS, + T1_BLEND_BLUE_SCALE, + T1_BLEND_BLUE_SHIFT, + T1_BLEND_FAMILY_BLUES, + T1_BLEND_FAMILY_OTHER_BLUES, + T1_BLEND_FORCE_BOLD, + + T1_BLEND_MAX /* do not remove */ + + } T1_Blend_Flags; + + + /* these constants are deprecated; use the corresponding */ + /* `T1_Blend_Flags` values instead */ +#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION +#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS +#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE +#define t1_blend_blue_values T1_BLEND_BLUE_VALUES +#define t1_blend_other_blues T1_BLEND_OTHER_BLUES +#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH +#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT +#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS +#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS +#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE +#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT +#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES +#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES +#define t1_blend_force_bold T1_BLEND_FORCE_BOLD +#define t1_blend_max T1_BLEND_MAX + + /* */ + + + /* maximum number of Multiple Masters designs, as defined in the spec */ +#define T1_MAX_MM_DESIGNS 16 + + /* maximum number of Multiple Masters axes, as defined in the spec */ +#define T1_MAX_MM_AXIS 4 + + /* maximum number of elements in a design map */ +#define T1_MAX_MM_MAP_POINTS 20 + + + /* this structure is used to store the BlendDesignMap entry for an axis */ + typedef struct PS_DesignMap_ + { + FT_Byte num_points; + FT_Long* design_points; + FT_Fixed* blend_points; + + } PS_DesignMapRec, *PS_DesignMap; + + /* backward compatible definition */ + typedef PS_DesignMapRec T1_DesignMap; + + + typedef struct PS_BlendRec_ + { + FT_UInt num_designs; + FT_UInt num_axis; + + FT_String* axis_names[T1_MAX_MM_AXIS]; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; + + FT_Fixed* weight_vector; + FT_Fixed* default_weight_vector; + + PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; + PS_Private privates [T1_MAX_MM_DESIGNS + 1]; + + FT_ULong blend_bitflags; + + FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; + + /* since 2.3.0 */ + + /* undocumented, optional: the default design instance; */ + /* corresponds to default_weight_vector -- */ + /* num_default_design_vector == 0 means it is not present */ + /* in the font and associated metrics files */ + FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; + FT_UInt num_default_design_vector; + + } PS_BlendRec, *PS_Blend; + + + /* backward compatible definition */ + typedef PS_BlendRec T1_Blend; + + + /************************************************************************** + * + * @struct: + * CID_FaceDictRec + * + * @description: + * A structure used to represent data in a CID top-level dictionary. In + * most cases, they are part of the font's '/FDArray' array. Within a + * CID font file, such (internal) subfont dictionaries are enclosed by + * '%ADOBeginFontDict' and '%ADOEndFontDict' comments. + * + * Note that `CID_FaceDictRec` misses a field for the '/FontName' + * keyword, specifying the subfont's name (the top-level font name is + * given by the '/CIDFontName' keyword). This is an oversight, but it + * doesn't limit the 'cid' font module's functionality because FreeType + * neither needs this entry nor gives access to CID subfonts. + */ + typedef struct CID_FaceDictRec_ + { + PS_PrivateRec private_dict; + + FT_UInt len_buildchar; + FT_Fixed forcebold_threshold; + FT_Pos stroke_width; + FT_Fixed expansion_factor; /* this is a duplicate of */ + /* `private_dict->expansion_factor' */ + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_UInt num_subrs; + FT_ULong subrmap_offset; + FT_Int sd_bytes; + + } CID_FaceDictRec; + + + /************************************************************************** + * + * @struct: + * CID_FaceDict + * + * @description: + * A handle to a @CID_FaceDictRec structure. + */ + typedef struct CID_FaceDictRec_* CID_FaceDict; + + + /************************************************************************** + * + * @struct: + * CID_FontDict + * + * @description: + * This type is equivalent to @CID_FaceDictRec. It is deprecated but + * kept to maintain source compatibility between various versions of + * FreeType. + */ + typedef CID_FaceDictRec CID_FontDict; + + + /************************************************************************** + * + * @struct: + * CID_FaceInfoRec + * + * @description: + * A structure used to represent CID Face information. + */ + typedef struct CID_FaceInfoRec_ + { + FT_String* cid_font_name; + FT_Fixed cid_version; + FT_Int cid_font_type; + + FT_String* registry; + FT_String* ordering; + FT_Int supplement; + + PS_FontInfoRec font_info; + FT_BBox font_bbox; + FT_ULong uid_base; + + FT_Int num_xuid; + FT_ULong xuid[16]; + + FT_ULong cidmap_offset; + FT_Int fd_bytes; + FT_Int gd_bytes; + FT_ULong cid_count; + + FT_Int num_dicts; + CID_FaceDict font_dicts; + + FT_ULong data_offset; + + } CID_FaceInfoRec; + + + /************************************************************************** + * + * @struct: + * CID_FaceInfo + * + * @description: + * A handle to a @CID_FaceInfoRec structure. + */ + typedef struct CID_FaceInfoRec_* CID_FaceInfo; + + + /************************************************************************** + * + * @struct: + * CID_Info + * + * @description: + * This type is equivalent to @CID_FaceInfoRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef CID_FaceInfoRec CID_Info; + + + /************************************************************************** + * + * @function: + * FT_Has_PS_Glyph_Names + * + * @description: + * Return true if a given face provides reliable PostScript glyph names. + * This is similar to using the @FT_HAS_GLYPH_NAMES macro, except that + * certain fonts (mostly TrueType) contain incorrect glyph name tables. + * + * When this function returns true, the caller is sure that the glyph + * names returned by @FT_Get_Glyph_Name are reliable. + * + * @input: + * face :: + * face handle + * + * @return: + * Boolean. True if glyph names are reliable. + * + */ + FT_EXPORT( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Info + * + * @description: + * Retrieve the @PS_FontInfoRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_info :: + * Output font info structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * String pointers within the @PS_FontInfoRec structure are owned by the + * face and don't need to be freed by the caller. Missing entries in + * the font's FontInfo dictionary are represented by `NULL` pointers. + * + * If the font's format is not PostScript-based, this function will + * return the `FT_Err_Invalid_Argument` error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfo afont_info ); + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Private + * + * @description: + * Retrieve the @PS_PrivateRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_private :: + * Output private dictionary structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the @PS_PrivateRec structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument` error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_Private afont_private ); + + + /************************************************************************** + * + * @enum: + * T1_EncodingType + * + * @description: + * An enumeration describing the 'Encoding' entry in a Type 1 dictionary. + * + * @values: + * T1_ENCODING_TYPE_NONE :: + * T1_ENCODING_TYPE_ARRAY :: + * T1_ENCODING_TYPE_STANDARD :: + * T1_ENCODING_TYPE_ISOLATIN1 :: + * T1_ENCODING_TYPE_EXPERT :: + * + * @since: + * 2.4.8 + */ + typedef enum T1_EncodingType_ + { + T1_ENCODING_TYPE_NONE = 0, + T1_ENCODING_TYPE_ARRAY, + T1_ENCODING_TYPE_STANDARD, + T1_ENCODING_TYPE_ISOLATIN1, + T1_ENCODING_TYPE_EXPERT + + } T1_EncodingType; + + + /************************************************************************** + * + * @enum: + * PS_Dict_Keys + * + * @description: + * An enumeration used in calls to @FT_Get_PS_Font_Value to identify the + * Type~1 dictionary entry to retrieve. + * + * @values: + * PS_DICT_FONT_TYPE :: + * PS_DICT_FONT_MATRIX :: + * PS_DICT_FONT_BBOX :: + * PS_DICT_PAINT_TYPE :: + * PS_DICT_FONT_NAME :: + * PS_DICT_UNIQUE_ID :: + * PS_DICT_NUM_CHAR_STRINGS :: + * PS_DICT_CHAR_STRING_KEY :: + * PS_DICT_CHAR_STRING :: + * PS_DICT_ENCODING_TYPE :: + * PS_DICT_ENCODING_ENTRY :: + * PS_DICT_NUM_SUBRS :: + * PS_DICT_SUBR :: + * PS_DICT_STD_HW :: + * PS_DICT_STD_VW :: + * PS_DICT_NUM_BLUE_VALUES :: + * PS_DICT_BLUE_VALUE :: + * PS_DICT_BLUE_FUZZ :: + * PS_DICT_NUM_OTHER_BLUES :: + * PS_DICT_OTHER_BLUE :: + * PS_DICT_NUM_FAMILY_BLUES :: + * PS_DICT_FAMILY_BLUE :: + * PS_DICT_NUM_FAMILY_OTHER_BLUES :: + * PS_DICT_FAMILY_OTHER_BLUE :: + * PS_DICT_BLUE_SCALE :: + * PS_DICT_BLUE_SHIFT :: + * PS_DICT_NUM_STEM_SNAP_H :: + * PS_DICT_STEM_SNAP_H :: + * PS_DICT_NUM_STEM_SNAP_V :: + * PS_DICT_STEM_SNAP_V :: + * PS_DICT_FORCE_BOLD :: + * PS_DICT_RND_STEM_UP :: + * PS_DICT_MIN_FEATURE :: + * PS_DICT_LEN_IV :: + * PS_DICT_PASSWORD :: + * PS_DICT_LANGUAGE_GROUP :: + * PS_DICT_VERSION :: + * PS_DICT_NOTICE :: + * PS_DICT_FULL_NAME :: + * PS_DICT_FAMILY_NAME :: + * PS_DICT_WEIGHT :: + * PS_DICT_IS_FIXED_PITCH :: + * PS_DICT_UNDERLINE_POSITION :: + * PS_DICT_UNDERLINE_THICKNESS :: + * PS_DICT_FS_TYPE :: + * PS_DICT_ITALIC_ANGLE :: + * + * @since: + * 2.4.8 + */ + typedef enum PS_Dict_Keys_ + { + /* conventionally in the font dictionary */ + PS_DICT_FONT_TYPE, /* FT_Byte */ + PS_DICT_FONT_MATRIX, /* FT_Fixed */ + PS_DICT_FONT_BBOX, /* FT_Fixed */ + PS_DICT_PAINT_TYPE, /* FT_Byte */ + PS_DICT_FONT_NAME, /* FT_String* */ + PS_DICT_UNIQUE_ID, /* FT_Int */ + PS_DICT_NUM_CHAR_STRINGS, /* FT_Int */ + PS_DICT_CHAR_STRING_KEY, /* FT_String* */ + PS_DICT_CHAR_STRING, /* FT_String* */ + PS_DICT_ENCODING_TYPE, /* T1_EncodingType */ + PS_DICT_ENCODING_ENTRY, /* FT_String* */ + + /* conventionally in the font Private dictionary */ + PS_DICT_NUM_SUBRS, /* FT_Int */ + PS_DICT_SUBR, /* FT_String* */ + PS_DICT_STD_HW, /* FT_UShort */ + PS_DICT_STD_VW, /* FT_UShort */ + PS_DICT_NUM_BLUE_VALUES, /* FT_Byte */ + PS_DICT_BLUE_VALUE, /* FT_Short */ + PS_DICT_BLUE_FUZZ, /* FT_Int */ + PS_DICT_NUM_OTHER_BLUES, /* FT_Byte */ + PS_DICT_OTHER_BLUE, /* FT_Short */ + PS_DICT_NUM_FAMILY_BLUES, /* FT_Byte */ + PS_DICT_FAMILY_BLUE, /* FT_Short */ + PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte */ + PS_DICT_FAMILY_OTHER_BLUE, /* FT_Short */ + PS_DICT_BLUE_SCALE, /* FT_Fixed */ + PS_DICT_BLUE_SHIFT, /* FT_Int */ + PS_DICT_NUM_STEM_SNAP_H, /* FT_Byte */ + PS_DICT_STEM_SNAP_H, /* FT_Short */ + PS_DICT_NUM_STEM_SNAP_V, /* FT_Byte */ + PS_DICT_STEM_SNAP_V, /* FT_Short */ + PS_DICT_FORCE_BOLD, /* FT_Bool */ + PS_DICT_RND_STEM_UP, /* FT_Bool */ + PS_DICT_MIN_FEATURE, /* FT_Short */ + PS_DICT_LEN_IV, /* FT_Int */ + PS_DICT_PASSWORD, /* FT_Long */ + PS_DICT_LANGUAGE_GROUP, /* FT_Long */ + + /* conventionally in the font FontInfo dictionary */ + PS_DICT_VERSION, /* FT_String* */ + PS_DICT_NOTICE, /* FT_String* */ + PS_DICT_FULL_NAME, /* FT_String* */ + PS_DICT_FAMILY_NAME, /* FT_String* */ + PS_DICT_WEIGHT, /* FT_String* */ + PS_DICT_IS_FIXED_PITCH, /* FT_Bool */ + PS_DICT_UNDERLINE_POSITION, /* FT_Short */ + PS_DICT_UNDERLINE_THICKNESS, /* FT_UShort */ + PS_DICT_FS_TYPE, /* FT_UShort */ + PS_DICT_ITALIC_ANGLE, /* FT_Long */ + + PS_DICT_MAX = PS_DICT_ITALIC_ANGLE + + } PS_Dict_Keys; + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Value + * + * @description: + * Retrieve the value for the supplied key from a PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * key :: + * An enumeration value representing the dictionary key to retrieve. + * + * idx :: + * For array values, this specifies the index to be returned. + * + * value :: + * A pointer to memory into which to write the value. + * + * valen_len :: + * The size, in bytes, of the memory supplied for the value. + * + * @output: + * value :: + * The value matching the above key, if it exists. + * + * @return: + * The amount of memory (in bytes) required to hold the requested value + * (if it exists, -1 otherwise). + * + * @note: + * The values returned are not pointers into the internal structures of + * the face, but are 'fresh' copies, so that the memory containing them + * belongs to the calling application. This also enforces the + * 'read-only' nature of these values, i.e., this function cannot be + * used to manipulate the face. + * + * `value` is a void pointer because the values returned can be of + * various types. + * + * If either `value` is `NULL` or `value_len` is too small, just the + * required memory size for the requested entry is returned. + * + * The `idx` parameter is used, not only to retrieve elements of, for + * example, the FontMatrix or FontBBox, but also to retrieve name keys + * from the CharStrings dictionary, and the charstrings themselves. It + * is ignored for atomic values. + * + * `PS_DICT_BLUE_SCALE` returns a value that is scaled up by 1000. To + * get the value as in the font stream, you need to divide by 65536000.0 + * (to remove the FT_Fixed scale, and the x1000 scale). + * + * IMPORTANT: Only key/value pairs read by the FreeType interpreter can + * be retrieved. So, for example, PostScript procedures such as NP, ND, + * and RD are not available. Arbitrary keys are, obviously, not be + * available either. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument` error code. + * + * @since: + * 2.4.8 + * + */ + FT_EXPORT( FT_Long ) + FT_Get_PS_Font_Value( FT_Face face, + PS_Dict_Keys key, + FT_UInt idx, + void *value, + FT_Long value_len ); + + /* */ + +FT_END_HEADER + +#endif /* T1TABLES_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/ttnameid.h b/NothinFancy/dep/include/freetype/ttnameid.h new file mode 100644 index 0000000..72f9f76 --- /dev/null +++ b/NothinFancy/dep/include/freetype/ttnameid.h @@ -0,0 +1,1235 @@ +/**************************************************************************** + * + * ttnameid.h + * + * TrueType name ID definitions (specification only). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTNAMEID_H_ +#define TTNAMEID_H_ + + + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * truetype_tables + */ + + + /************************************************************************** + * + * Possible values for the 'platform' identifier code in the name records + * of an SFNT 'name' table. + * + */ + + + /************************************************************************** + * + * @enum: + * TT_PLATFORM_XXX + * + * @description: + * A list of valid values for the `platform_id` identifier code in + * @FT_CharMapRec and @FT_SfntName structures. + * + * @values: + * TT_PLATFORM_APPLE_UNICODE :: + * Used by Apple to indicate a Unicode character map and/or name entry. + * See @TT_APPLE_ID_XXX for corresponding `encoding_id` values. Note + * that name entries in this format are coded as big-endian UCS-2 + * character codes _only_. + * + * TT_PLATFORM_MACINTOSH :: + * Used by Apple to indicate a MacOS-specific charmap and/or name + * entry. See @TT_MAC_ID_XXX for corresponding `encoding_id` values. + * Note that most TrueType fonts contain an Apple roman charmap to be + * usable on MacOS systems (even if they contain a Microsoft charmap as + * well). + * + * TT_PLATFORM_ISO :: + * This value was used to specify ISO/IEC 10646 charmaps. It is + * however now deprecated. See @TT_ISO_ID_XXX for a list of + * corresponding `encoding_id` values. + * + * TT_PLATFORM_MICROSOFT :: + * Used by Microsoft to indicate Windows-specific charmaps. See + * @TT_MS_ID_XXX for a list of corresponding `encoding_id` values. + * Note that most fonts contain a Unicode charmap using + * (`TT_PLATFORM_MICROSOFT`, @TT_MS_ID_UNICODE_CS). + * + * TT_PLATFORM_CUSTOM :: + * Used to indicate application-specific charmaps. + * + * TT_PLATFORM_ADOBE :: + * This value isn't part of any font format specification, but is used + * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec + * structure. See @TT_ADOBE_ID_XXX. + */ + +#define TT_PLATFORM_APPLE_UNICODE 0 +#define TT_PLATFORM_MACINTOSH 1 +#define TT_PLATFORM_ISO 2 /* deprecated */ +#define TT_PLATFORM_MICROSOFT 3 +#define TT_PLATFORM_CUSTOM 4 +#define TT_PLATFORM_ADOBE 7 /* artificial */ + + + /************************************************************************** + * + * @enum: + * TT_APPLE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. + * + * @values: + * TT_APPLE_ID_DEFAULT :: + * Unicode version 1.0. + * + * TT_APPLE_ID_UNICODE_1_1 :: + * Unicode 1.1; specifies Hangul characters starting at U+34xx. + * + * TT_APPLE_ID_ISO_10646 :: + * Deprecated (identical to preceding). + * + * TT_APPLE_ID_UNICODE_2_0 :: + * Unicode 2.0 and beyond (UTF-16 BMP only). + * + * TT_APPLE_ID_UNICODE_32 :: + * Unicode 3.1 and beyond, using UTF-32. + * + * TT_APPLE_ID_VARIANT_SELECTOR :: + * From Adobe, not Apple. Not a normal cmap. Specifies variations on + * a real cmap. + * + * TT_APPLE_ID_FULL_UNICODE :: + * Used for fallback fonts that provide complete Unicode coverage with + * a type~13 cmap. + */ + +#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ +#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ +#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ +#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ +#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ +#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ +#define TT_APPLE_ID_FULL_UNICODE 6 /* used with type 13 cmaps */ + + + /************************************************************************** + * + * @enum: + * TT_MAC_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_MACINTOSH charmaps and name entries. + */ + +#define TT_MAC_ID_ROMAN 0 +#define TT_MAC_ID_JAPANESE 1 +#define TT_MAC_ID_TRADITIONAL_CHINESE 2 +#define TT_MAC_ID_KOREAN 3 +#define TT_MAC_ID_ARABIC 4 +#define TT_MAC_ID_HEBREW 5 +#define TT_MAC_ID_GREEK 6 +#define TT_MAC_ID_RUSSIAN 7 +#define TT_MAC_ID_RSYMBOL 8 +#define TT_MAC_ID_DEVANAGARI 9 +#define TT_MAC_ID_GURMUKHI 10 +#define TT_MAC_ID_GUJARATI 11 +#define TT_MAC_ID_ORIYA 12 +#define TT_MAC_ID_BENGALI 13 +#define TT_MAC_ID_TAMIL 14 +#define TT_MAC_ID_TELUGU 15 +#define TT_MAC_ID_KANNADA 16 +#define TT_MAC_ID_MALAYALAM 17 +#define TT_MAC_ID_SINHALESE 18 +#define TT_MAC_ID_BURMESE 19 +#define TT_MAC_ID_KHMER 20 +#define TT_MAC_ID_THAI 21 +#define TT_MAC_ID_LAOTIAN 22 +#define TT_MAC_ID_GEORGIAN 23 +#define TT_MAC_ID_ARMENIAN 24 +#define TT_MAC_ID_MALDIVIAN 25 +#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 +#define TT_MAC_ID_TIBETAN 26 +#define TT_MAC_ID_MONGOLIAN 27 +#define TT_MAC_ID_GEEZ 28 +#define TT_MAC_ID_SLAVIC 29 +#define TT_MAC_ID_VIETNAMESE 30 +#define TT_MAC_ID_SINDHI 31 +#define TT_MAC_ID_UNINTERP 32 + + + /************************************************************************** + * + * @enum: + * TT_ISO_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for @TT_PLATFORM_ISO + * charmaps and name entries. + * + * Their use is now deprecated. + * + * @values: + * TT_ISO_ID_7BIT_ASCII :: + * ASCII. + * TT_ISO_ID_10646 :: + * ISO/10646. + * TT_ISO_ID_8859_1 :: + * Also known as Latin-1. + */ + +#define TT_ISO_ID_7BIT_ASCII 0 +#define TT_ISO_ID_10646 1 +#define TT_ISO_ID_8859_1 2 + + + /************************************************************************** + * + * @enum: + * TT_MS_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_MICROSOFT charmaps and name entries. + * + * @values: + * TT_MS_ID_SYMBOL_CS :: + * Microsoft symbol encoding. See @FT_ENCODING_MS_SYMBOL. + * + * TT_MS_ID_UNICODE_CS :: + * Microsoft WGL4 charmap, matching Unicode. See @FT_ENCODING_UNICODE. + * + * TT_MS_ID_SJIS :: + * Shift JIS Japanese encoding. See @FT_ENCODING_SJIS. + * + * TT_MS_ID_PRC :: + * Chinese encodings as used in the People's Republic of China (PRC). + * This means the encodings GB~2312 and its supersets GBK and GB~18030. + * See @FT_ENCODING_PRC. + * + * TT_MS_ID_BIG_5 :: + * Traditional Chinese as used in Taiwan and Hong Kong. See + * @FT_ENCODING_BIG5. + * + * TT_MS_ID_WANSUNG :: + * Korean Extended Wansung encoding. See @FT_ENCODING_WANSUNG. + * + * TT_MS_ID_JOHAB :: + * Korean Johab encoding. See @FT_ENCODING_JOHAB. + * + * TT_MS_ID_UCS_4 :: + * UCS-4 or UTF-32 charmaps. This has been added to the OpenType + * specification version 1.4 (mid-2001). + */ + +#define TT_MS_ID_SYMBOL_CS 0 +#define TT_MS_ID_UNICODE_CS 1 +#define TT_MS_ID_SJIS 2 +#define TT_MS_ID_PRC 3 +#define TT_MS_ID_BIG_5 4 +#define TT_MS_ID_WANSUNG 5 +#define TT_MS_ID_JOHAB 6 +#define TT_MS_ID_UCS_4 10 + + /* this value is deprecated */ +#define TT_MS_ID_GB2312 TT_MS_ID_PRC + + + /************************************************************************** + * + * @enum: + * TT_ADOBE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for @TT_PLATFORM_ADOBE + * charmaps. This is a FreeType-specific extension! + * + * @values: + * TT_ADOBE_ID_STANDARD :: + * Adobe standard encoding. + * TT_ADOBE_ID_EXPERT :: + * Adobe expert encoding. + * TT_ADOBE_ID_CUSTOM :: + * Adobe custom encoding. + * TT_ADOBE_ID_LATIN_1 :: + * Adobe Latin~1 encoding. + */ + +#define TT_ADOBE_ID_STANDARD 0 +#define TT_ADOBE_ID_EXPERT 1 +#define TT_ADOBE_ID_CUSTOM 2 +#define TT_ADOBE_ID_LATIN_1 3 + + + /************************************************************************** + * + * @enum: + * TT_MAC_LANGID_XXX + * + * @description: + * Possible values of the language identifier field in the name records + * of the SFNT 'name' table if the 'platform' identifier code is + * @TT_PLATFORM_MACINTOSH. These values are also used as return values + * for function @FT_Get_CMap_Language_ID. + * + * The canonical source for Apple's IDs is + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html + */ + +#define TT_MAC_LANGID_ENGLISH 0 +#define TT_MAC_LANGID_FRENCH 1 +#define TT_MAC_LANGID_GERMAN 2 +#define TT_MAC_LANGID_ITALIAN 3 +#define TT_MAC_LANGID_DUTCH 4 +#define TT_MAC_LANGID_SWEDISH 5 +#define TT_MAC_LANGID_SPANISH 6 +#define TT_MAC_LANGID_DANISH 7 +#define TT_MAC_LANGID_PORTUGUESE 8 +#define TT_MAC_LANGID_NORWEGIAN 9 +#define TT_MAC_LANGID_HEBREW 10 +#define TT_MAC_LANGID_JAPANESE 11 +#define TT_MAC_LANGID_ARABIC 12 +#define TT_MAC_LANGID_FINNISH 13 +#define TT_MAC_LANGID_GREEK 14 +#define TT_MAC_LANGID_ICELANDIC 15 +#define TT_MAC_LANGID_MALTESE 16 +#define TT_MAC_LANGID_TURKISH 17 +#define TT_MAC_LANGID_CROATIAN 18 +#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 +#define TT_MAC_LANGID_URDU 20 +#define TT_MAC_LANGID_HINDI 21 +#define TT_MAC_LANGID_THAI 22 +#define TT_MAC_LANGID_KOREAN 23 +#define TT_MAC_LANGID_LITHUANIAN 24 +#define TT_MAC_LANGID_POLISH 25 +#define TT_MAC_LANGID_HUNGARIAN 26 +#define TT_MAC_LANGID_ESTONIAN 27 +#define TT_MAC_LANGID_LETTISH 28 +#define TT_MAC_LANGID_SAAMISK 29 +#define TT_MAC_LANGID_FAEROESE 30 +#define TT_MAC_LANGID_FARSI 31 +#define TT_MAC_LANGID_RUSSIAN 32 +#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 +#define TT_MAC_LANGID_FLEMISH 34 +#define TT_MAC_LANGID_IRISH 35 +#define TT_MAC_LANGID_ALBANIAN 36 +#define TT_MAC_LANGID_ROMANIAN 37 +#define TT_MAC_LANGID_CZECH 38 +#define TT_MAC_LANGID_SLOVAK 39 +#define TT_MAC_LANGID_SLOVENIAN 40 +#define TT_MAC_LANGID_YIDDISH 41 +#define TT_MAC_LANGID_SERBIAN 42 +#define TT_MAC_LANGID_MACEDONIAN 43 +#define TT_MAC_LANGID_BULGARIAN 44 +#define TT_MAC_LANGID_UKRAINIAN 45 +#define TT_MAC_LANGID_BYELORUSSIAN 46 +#define TT_MAC_LANGID_UZBEK 47 +#define TT_MAC_LANGID_KAZAKH 48 +#define TT_MAC_LANGID_AZERBAIJANI 49 +#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 +#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 +#define TT_MAC_LANGID_ARMENIAN 51 +#define TT_MAC_LANGID_GEORGIAN 52 +#define TT_MAC_LANGID_MOLDAVIAN 53 +#define TT_MAC_LANGID_KIRGHIZ 54 +#define TT_MAC_LANGID_TAJIKI 55 +#define TT_MAC_LANGID_TURKMEN 56 +#define TT_MAC_LANGID_MONGOLIAN 57 +#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 +#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 +#define TT_MAC_LANGID_PASHTO 59 +#define TT_MAC_LANGID_KURDISH 60 +#define TT_MAC_LANGID_KASHMIRI 61 +#define TT_MAC_LANGID_SINDHI 62 +#define TT_MAC_LANGID_TIBETAN 63 +#define TT_MAC_LANGID_NEPALI 64 +#define TT_MAC_LANGID_SANSKRIT 65 +#define TT_MAC_LANGID_MARATHI 66 +#define TT_MAC_LANGID_BENGALI 67 +#define TT_MAC_LANGID_ASSAMESE 68 +#define TT_MAC_LANGID_GUJARATI 69 +#define TT_MAC_LANGID_PUNJABI 70 +#define TT_MAC_LANGID_ORIYA 71 +#define TT_MAC_LANGID_MALAYALAM 72 +#define TT_MAC_LANGID_KANNADA 73 +#define TT_MAC_LANGID_TAMIL 74 +#define TT_MAC_LANGID_TELUGU 75 +#define TT_MAC_LANGID_SINHALESE 76 +#define TT_MAC_LANGID_BURMESE 77 +#define TT_MAC_LANGID_KHMER 78 +#define TT_MAC_LANGID_LAO 79 +#define TT_MAC_LANGID_VIETNAMESE 80 +#define TT_MAC_LANGID_INDONESIAN 81 +#define TT_MAC_LANGID_TAGALOG 82 +#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 +#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 +#define TT_MAC_LANGID_AMHARIC 85 +#define TT_MAC_LANGID_TIGRINYA 86 +#define TT_MAC_LANGID_GALLA 87 +#define TT_MAC_LANGID_SOMALI 88 +#define TT_MAC_LANGID_SWAHILI 89 +#define TT_MAC_LANGID_RUANDA 90 +#define TT_MAC_LANGID_RUNDI 91 +#define TT_MAC_LANGID_CHEWA 92 +#define TT_MAC_LANGID_MALAGASY 93 +#define TT_MAC_LANGID_ESPERANTO 94 +#define TT_MAC_LANGID_WELSH 128 +#define TT_MAC_LANGID_BASQUE 129 +#define TT_MAC_LANGID_CATALAN 130 +#define TT_MAC_LANGID_LATIN 131 +#define TT_MAC_LANGID_QUECHUA 132 +#define TT_MAC_LANGID_GUARANI 133 +#define TT_MAC_LANGID_AYMARA 134 +#define TT_MAC_LANGID_TATAR 135 +#define TT_MAC_LANGID_UIGHUR 136 +#define TT_MAC_LANGID_DZONGKHA 137 +#define TT_MAC_LANGID_JAVANESE 138 +#define TT_MAC_LANGID_SUNDANESE 139 + + /* The following codes are new as of 2000-03-10 */ +#define TT_MAC_LANGID_GALICIAN 140 +#define TT_MAC_LANGID_AFRIKAANS 141 +#define TT_MAC_LANGID_BRETON 142 +#define TT_MAC_LANGID_INUKTITUT 143 +#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 +#define TT_MAC_LANGID_MANX_GAELIC 145 +#define TT_MAC_LANGID_IRISH_GAELIC 146 +#define TT_MAC_LANGID_TONGAN 147 +#define TT_MAC_LANGID_GREEK_POLYTONIC 148 +#define TT_MAC_LANGID_GREELANDIC 149 +#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 + + + /************************************************************************** + * + * @enum: + * TT_MS_LANGID_XXX + * + * @description: + * Possible values of the language identifier field in the name records + * of the SFNT 'name' table if the 'platform' identifier code is + * @TT_PLATFORM_MICROSOFT. These values are also used as return values + * for function @FT_Get_CMap_Language_ID. + * + * The canonical source for Microsoft's IDs is + * + * https://docs.microsoft.com/en-us/windows/desktop/Intl/language-identifier-constants-and-strings , + * + * however, we only provide macros for language identifiers present in + * the OpenType specification: Microsoft has abandoned the concept of + * LCIDs (language code identifiers), and format~1 of the 'name' table + * provides a better mechanism for languages not covered here. + * + * More legacy values not listed in the reference can be found in the + * @FT_TRUETYPE_IDS_H header file. + */ + +#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 +#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 +#define TT_MS_LANGID_ARABIC_EGYPT 0x0C01 +#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 +#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 +#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 +#define TT_MS_LANGID_ARABIC_TUNISIA 0x1C01 +#define TT_MS_LANGID_ARABIC_OMAN 0x2001 +#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 +#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 +#define TT_MS_LANGID_ARABIC_JORDAN 0x2C01 +#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 +#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 +#define TT_MS_LANGID_ARABIC_UAE 0x3801 +#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3C01 +#define TT_MS_LANGID_ARABIC_QATAR 0x4001 +#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 +#define TT_MS_LANGID_CATALAN_CATALAN 0x0403 +#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 +#define TT_MS_LANGID_CHINESE_PRC 0x0804 +#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0C04 +#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 +#define TT_MS_LANGID_CHINESE_MACAO 0x1404 +#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 +#define TT_MS_LANGID_DANISH_DENMARK 0x0406 +#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 +#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 +#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0C07 +#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEIN 0x1407 +#define TT_MS_LANGID_GREEK_GREECE 0x0408 +#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 +#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 +#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0C09 +#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 +#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 +#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 +#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1C09 +#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 +#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 +#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 +#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2C09 +#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 +#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 +#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 +#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 +#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 +#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040A +#define TT_MS_LANGID_SPANISH_MEXICO 0x080A +#define TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT 0x0C0A +#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100A +#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140A +#define TT_MS_LANGID_SPANISH_PANAMA 0x180A +#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1C0A +#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200A +#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240A +#define TT_MS_LANGID_SPANISH_PERU 0x280A +#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2C0A +#define TT_MS_LANGID_SPANISH_ECUADOR 0x300A +#define TT_MS_LANGID_SPANISH_CHILE 0x340A +#define TT_MS_LANGID_SPANISH_URUGUAY 0x380A +#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3C0A +#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400A +#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440A +#define TT_MS_LANGID_SPANISH_HONDURAS 0x480A +#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4C0A +#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500A +#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540A +#define TT_MS_LANGID_FINNISH_FINLAND 0x040B +#define TT_MS_LANGID_FRENCH_FRANCE 0x040C +#define TT_MS_LANGID_FRENCH_BELGIUM 0x080C +#define TT_MS_LANGID_FRENCH_CANADA 0x0C0C +#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100C +#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140C +#define TT_MS_LANGID_FRENCH_MONACO 0x180C +#define TT_MS_LANGID_HEBREW_ISRAEL 0x040D +#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040E +#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040F +#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 +#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 +#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 +#define TT_MS_LANGID_KOREAN_KOREA 0x0412 +#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 +#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 +#define TT_MS_LANGID_POLISH_POLAND 0x0415 +#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 +#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 +#define TT_MS_LANGID_ROMANSH_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 +#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 +#define TT_MS_LANGID_CROATIAN_CROATIA 0x041A +#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081A +#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0C1A +#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101A +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141A +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181A +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x1C1A +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC 0x201A +#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041B +#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041C +#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041D +#define TT_MS_LANGID_SWEDISH_FINLAND 0x081D +#define TT_MS_LANGID_THAI_THAILAND 0x041E +#define TT_MS_LANGID_TURKISH_TURKEY 0x041F +#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 +#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 +#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 +#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 +#define TT_MS_LANGID_SLOVENIAN_SLOVENIA 0x0424 +#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 +#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 +#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 +#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 +#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042A +#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042B +#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042C +#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082C +#define TT_MS_LANGID_BASQUE_BASQUE 0x042D +#define TT_MS_LANGID_UPPER_SORBIAN_GERMANY 0x042E +#define TT_MS_LANGID_LOWER_SORBIAN_GERMANY 0x082E +#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042F +#define TT_MS_LANGID_SETSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ISIZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 +#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 +#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 +#define TT_MS_LANGID_HINDI_INDIA 0x0439 +#define TT_MS_LANGID_MALTESE_MALTA 0x043A +#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043B +#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083B +#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3B +#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103B +#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143B +#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183B +#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3B +#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203B +#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243B +#define TT_MS_LANGID_IRISH_IRELAND 0x083C +#define TT_MS_LANGID_MALAY_MALAYSIA 0x043E +#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083E +#define TT_MS_LANGID_KAZAKH_KAZAKHSTAN 0x043F +#define TT_MS_LANGID_KYRGYZ_KYRGYZSTAN /* Cyrillic*/ 0x0440 +#define TT_MS_LANGID_KISWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 +#define TT_MS_LANGID_TATAR_RUSSIA 0x0444 +#define TT_MS_LANGID_BENGALI_INDIA 0x0445 +#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 +#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 +#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 +#define TT_MS_LANGID_ODIA_INDIA 0x0448 +#define TT_MS_LANGID_TAMIL_INDIA 0x0449 +#define TT_MS_LANGID_TELUGU_INDIA 0x044A +#define TT_MS_LANGID_KANNADA_INDIA 0x044B +#define TT_MS_LANGID_MALAYALAM_INDIA 0x044C +#define TT_MS_LANGID_ASSAMESE_INDIA 0x044D +#define TT_MS_LANGID_MARATHI_INDIA 0x044E +#define TT_MS_LANGID_SANSKRIT_INDIA 0x044F +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 +#define TT_MS_LANGID_MONGOLIAN_PRC 0x0850 +#define TT_MS_LANGID_TIBETAN_PRC 0x0451 +#define TT_MS_LANGID_WELSH_UNITED_KINGDOM 0x0452 +#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 +#define TT_MS_LANGID_LAO_LAOS 0x0454 +#define TT_MS_LANGID_GALICIAN_GALICIAN 0x0456 +#define TT_MS_LANGID_KONKANI_INDIA 0x0457 +#define TT_MS_LANGID_SYRIAC_SYRIA 0x045A +#define TT_MS_LANGID_SINHALA_SRI_LANKA 0x045B +#define TT_MS_LANGID_INUKTITUT_CANADA 0x045D +#define TT_MS_LANGID_INUKTITUT_CANADA_LATIN 0x085D +#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045E +#define TT_MS_LANGID_TAMAZIGHT_ALGERIA 0x085F +#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 +#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 +#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 +#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 +#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 +#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 +#define TT_MS_LANGID_YORUBA_NIGERIA 0x046A +#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046B +#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086B +#define TT_MS_LANGID_QUECHUA_PERU 0x0C6B +#define TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA 0x046C +#define TT_MS_LANGID_BASHKIR_RUSSIA 0x046D +#define TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG 0x046E +#define TT_MS_LANGID_GREENLANDIC_GREENLAND 0x046F +#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 +#define TT_MS_LANGID_YI_PRC 0x0478 +#define TT_MS_LANGID_MAPUDUNGUN_CHILE 0x047A +#define TT_MS_LANGID_MOHAWK_MOHAWK 0x047C +#define TT_MS_LANGID_BRETON_FRANCE 0x047E +#define TT_MS_LANGID_UIGHUR_PRC 0x0480 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 +#define TT_MS_LANGID_OCCITAN_FRANCE 0x0482 +#define TT_MS_LANGID_CORSICAN_FRANCE 0x0483 +#define TT_MS_LANGID_ALSATIAN_FRANCE 0x0484 +#define TT_MS_LANGID_YAKUT_RUSSIA 0x0485 +#define TT_MS_LANGID_KICHE_GUATEMALA 0x0486 +#define TT_MS_LANGID_KINYARWANDA_RWANDA 0x0487 +#define TT_MS_LANGID_WOLOF_SENEGAL 0x0488 +#define TT_MS_LANGID_DARI_AFGHANISTAN 0x048C + + /* */ + + + /* legacy macro definitions not present in OpenType 1.8.1 */ +#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 +#define TT_MS_LANGID_CATALAN_SPAIN \ + TT_MS_LANGID_CATALAN_CATALAN +#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CHINESE_MACAU \ + TT_MS_LANGID_CHINESE_MACAO +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI \ + TT_MS_LANGID_GERMAN_LIECHTENSTEIN +#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 +#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 +#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3C09 +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT \ + TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT +#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40AU +#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1C0C +#define TT_MS_LANGID_FRENCH_REUNION 0x200C +#define TT_MS_LANGID_FRENCH_CONGO 0x240C + /* which was formerly: */ +#define TT_MS_LANGID_FRENCH_ZAIRE \ + TT_MS_LANGID_FRENCH_CONGO +#define TT_MS_LANGID_FRENCH_SENEGAL 0x280C +#define TT_MS_LANGID_FRENCH_CAMEROON 0x2C0C +#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300C +#define TT_MS_LANGID_FRENCH_MALI 0x340C +#define TT_MS_LANGID_FRENCH_MOROCCO 0x380C +#define TT_MS_LANGID_FRENCH_HAITI 0x3C0C +#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40CU +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA \ + TT_MS_LANGID_KOREAN_KOREA +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND \ + TT_MS_LANGID_ROMANSH_SWITZERLAND +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_URDU_INDIA 0x0820 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_SLOVENE_SLOVENIA \ + TT_MS_LANGID_SLOVENIAN_SLOVENIA +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_BASQUE_SPAIN \ + TT_MS_LANGID_BASQUE_BASQUE +#define TT_MS_LANGID_SORBIAN_GERMANY \ + TT_MS_LANGID_UPPER_SORBIAN_GERMANY +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA \ + TT_MS_LANGID_SETSWANA_SOUTH_AFRICA +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA \ + TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA \ + TT_MS_LANGID_ISIZULU_SOUTH_AFRICA +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043B + /* the next two values are incorrectly inverted */ +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043C +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083C +#define TT_MS_LANGID_YIDDISH_GERMANY 0x043D +#define TT_MS_LANGID_KAZAK_KAZAKSTAN \ + TT_MS_LANGID_KAZAKH_KAZAKHSTAN +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN \ + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN +#define TT_MS_LANGID_SWAHILI_KENYA \ + TT_MS_LANGID_KISWAHILI_KENYA +#define TT_MS_LANGID_TATAR_TATARSTAN \ + TT_MS_LANGID_TATAR_RUSSIA +#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 +#define TT_MS_LANGID_ORIYA_INDIA \ + TT_MS_LANGID_ODIA_INDIA +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN \ + TT_MS_LANGID_MONGOLIAN_PRC +#define TT_MS_LANGID_TIBETAN_CHINA \ + TT_MS_LANGID_TIBETAN_PRC +#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 +#define TT_MS_LANGID_TIBETAN_BHUTAN \ + TT_MS_LANGID_DZONGHKA_BHUTAN +#define TT_MS_LANGID_WELSH_WALES \ + TT_MS_LANGID_WELSH_UNITED_KINGDOM +#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 +#define TT_MS_LANGID_GALICIAN_SPAIN \ + TT_MS_LANGID_GALICIAN_GALICIAN +#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 +#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 +#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 +#define TT_MS_LANGID_SINHALESE_SRI_LANKA \ + TT_MS_LANGID_SINHALA_SRI_LANKA +#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045C +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045F +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN \ + TT_MS_LANGID_TAMAZIGHT_ALGERIA +#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 +#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 +#define TT_MS_LANGID_KASHMIRI_INDIA \ + TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_NEPALI_INDIA 0x0861 +#define TT_MS_LANGID_DIVEHI_MALDIVES \ + TT_MS_LANGID_DHIVEHI_MALDIVES +#define TT_MS_LANGID_EDO_NIGERIA 0x0466 +#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 +#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 +#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA \ + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA +#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA +#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 +#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 +#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 +#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 +#define TT_MS_LANGID_TIGRIGNA_ERYTREA \ + TT_MS_LANGID_TIGRIGNA_ERYTHREA +#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 +#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 +#define TT_MS_LANGID_LATIN 0x0476 +#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 +#define TT_MS_LANGID_YI_CHINA \ + TT_MS_LANGID_YI_PRC +#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 +#define TT_MS_LANGID_UIGHUR_CHINA \ + TT_MS_LANGID_UIGHUR_PRC + + + /************************************************************************** + * + * @enum: + * TT_NAME_ID_XXX + * + * @description: + * Possible values of the 'name' identifier field in the name records of + * an SFNT 'name' table. These values are platform independent. + */ + +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 + + /* the following values are from the OpenType spec */ +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 + /* number 15 is reserved */ +#define TT_NAME_ID_TYPOGRAPHIC_FAMILY 16 +#define TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 + + /* The following code is new as of 2000-01-21 */ +#define TT_NAME_ID_SAMPLE_TEXT 19 + + /* This is new in OpenType 1.3 */ +#define TT_NAME_ID_CID_FINDFONT_NAME 20 + + /* This is new in OpenType 1.5 */ +#define TT_NAME_ID_WWS_FAMILY 21 +#define TT_NAME_ID_WWS_SUBFAMILY 22 + + /* This is new in OpenType 1.7 */ +#define TT_NAME_ID_LIGHT_BACKGROUND 23 +#define TT_NAME_ID_DARK_BACKGROUND 24 + + /* This is new in OpenType 1.8 */ +#define TT_NAME_ID_VARIATIONS_PREFIX 25 + + /* these two values are deprecated */ +#define TT_NAME_ID_PREFERRED_FAMILY TT_NAME_ID_TYPOGRAPHIC_FAMILY +#define TT_NAME_ID_PREFERRED_SUBFAMILY TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY + + + /************************************************************************** + * + * @enum: + * TT_UCR_XXX + * + * @description: + * Possible bit mask values for the `ulUnicodeRangeX` fields in an SFNT + * 'OS/2' table. + */ + + /* ulUnicodeRange1 */ + /* --------------- */ + + /* Bit 0 Basic Latin */ +#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ + /* Bit 1 C1 Controls and Latin-1 Supplement */ +#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ + /* Bit 2 Latin Extended-A */ +#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ + /* Bit 3 Latin Extended-B */ +#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ + /* Bit 4 IPA Extensions */ + /* Phonetic Extensions */ + /* Phonetic Extensions Supplement */ +#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ + /* U+1D00-U+1D7F */ + /* U+1D80-U+1DBF */ + /* Bit 5 Spacing Modifier Letters */ + /* Modifier Tone Letters */ +#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ + /* U+A700-U+A71F */ + /* Bit 6 Combining Diacritical Marks */ + /* Combining Diacritical Marks Supplement */ +#define TT_UCR_COMBINING_DIACRITICAL_MARKS (1L << 6) /* U+0300-U+036F */ + /* U+1DC0-U+1DFF */ + /* Bit 7 Greek and Coptic */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 Coptic */ +#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */ + /* Bit 9 Cyrillic */ + /* Cyrillic Supplement */ + /* Cyrillic Extended-A */ + /* Cyrillic Extended-B */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* U+0500-U+052F */ + /* U+2DE0-U+2DFF */ + /* U+A640-U+A69F */ + /* Bit 10 Armenian */ +#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ + /* Bit 11 Hebrew */ +#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ + /* Bit 12 Vai */ +#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */ + /* Bit 13 Arabic */ + /* Arabic Supplement */ +#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ + /* U+0750-U+077F */ + /* Bit 14 NKo */ +#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */ + /* Bit 15 Devanagari */ +#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ + /* Bit 16 Bengali */ +#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ + /* Bit 17 Gurmukhi */ +#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ + /* Bit 18 Gujarati */ +#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ + /* Bit 19 Oriya */ +#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ + /* Bit 20 Tamil */ +#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ + /* Bit 21 Telugu */ +#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ + /* Bit 22 Kannada */ +#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ + /* Bit 23 Malayalam */ +#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ + /* Bit 24 Thai */ +#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ + /* Bit 25 Lao */ +#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ + /* Bit 26 Georgian */ + /* Georgian Supplement */ +#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ + /* U+2D00-U+2D2F */ + /* Bit 27 Balinese */ +#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */ + /* Bit 28 Hangul Jamo */ +#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ + /* Bit 29 Latin Extended Additional */ + /* Latin Extended-C */ + /* Latin Extended-D */ +#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ + /* U+2C60-U+2C7F */ + /* U+A720-U+A7FF */ + /* Bit 30 Greek Extended */ +#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ + /* Bit 31 General Punctuation */ + /* Supplemental Punctuation */ +#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ + /* U+2E00-U+2E7F */ + + /* ulUnicodeRange2 */ + /* --------------- */ + + /* Bit 32 Superscripts And Subscripts */ +#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ + /* Bit 33 Currency Symbols */ +#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ + /* Bit 34 Combining Diacritical Marks For Symbols */ +#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ + (1L << 2) /* U+20D0-U+20FF */ + /* Bit 35 Letterlike Symbols */ +#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ + /* Bit 36 Number Forms */ +#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ + /* Bit 37 Arrows */ + /* Supplemental Arrows-A */ + /* Supplemental Arrows-B */ + /* Miscellaneous Symbols and Arrows */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* U+27F0-U+27FF */ + /* U+2900-U+297F */ + /* U+2B00-U+2BFF */ + /* Bit 38 Mathematical Operators */ + /* Supplemental Mathematical Operators */ + /* Miscellaneous Mathematical Symbols-A */ + /* Miscellaneous Mathematical Symbols-B */ +#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ + /* U+2A00-U+2AFF */ + /* U+27C0-U+27EF */ + /* U+2980-U+29FF */ + /* Bit 39 Miscellaneous Technical */ +#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ + /* Bit 40 Control Pictures */ +#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ + /* Bit 41 Optical Character Recognition */ +#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ + /* Bit 42 Enclosed Alphanumerics */ +#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ + /* Bit 43 Box Drawing */ +#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ + /* Bit 44 Block Elements */ +#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ + /* Bit 45 Geometric Shapes */ +#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ + /* Bit 46 Miscellaneous Symbols */ +#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ + /* Bit 47 Dingbats */ +#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ + /* Bit 48 CJK Symbols and Punctuation */ +#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ + /* Bit 49 Hiragana */ +#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ + /* Bit 50 Katakana */ + /* Katakana Phonetic Extensions */ +#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ + /* U+31F0-U+31FF */ + /* Bit 51 Bopomofo */ + /* Bopomofo Extended */ +#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ + /* U+31A0-U+31BF */ + /* Bit 52 Hangul Compatibility Jamo */ +#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ + /* Bit 53 Phags-Pa */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */ +#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */ +#define TT_UCR_PHAGSPA + /* Bit 54 Enclosed CJK Letters and Months */ +#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ + /* Bit 55 CJK Compatibility */ +#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ + /* Bit 56 Hangul Syllables */ +#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ + /* Bit 57 High Surrogates */ + /* High Private Use Surrogates */ + /* Low Surrogates */ + + /* According to OpenType specs v.1.3+, */ + /* setting bit 57 implies that there is */ + /* at least one codepoint beyond the */ + /* Basic Multilingual Plane that is */ + /* supported by this font. So it really */ + /* means >= U+10000. */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ + /* U+DB80-U+DBFF */ + /* U+DC00-U+DFFF */ +#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES + /* Bit 58 Phoenician */ +#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/ + /* Bit 59 CJK Unified Ideographs */ + /* CJK Radicals Supplement */ + /* Kangxi Radicals */ + /* Ideographic Description Characters */ + /* CJK Unified Ideographs Extension A */ + /* CJK Unified Ideographs Extension B */ + /* Kanbun */ +#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ + /* U+2E80-U+2EFF */ + /* U+2F00-U+2FDF */ + /* U+2FF0-U+2FFF */ + /* U+3400-U+4DB5 */ + /*U+20000-U+2A6DF*/ + /* U+3190-U+319F */ + /* Bit 60 Private Use */ +#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ + /* Bit 61 CJK Strokes */ + /* CJK Compatibility Ideographs */ + /* CJK Compatibility Ideographs Supplement */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */ + /* U+F900-U+FAFF */ + /*U+2F800-U+2FA1F*/ + /* Bit 62 Alphabetic Presentation Forms */ +#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ + /* Bit 63 Arabic Presentation Forms-A */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_A (1L << 31) /* U+FB50-U+FDFF */ + + /* ulUnicodeRange3 */ + /* --------------- */ + + /* Bit 64 Combining Half Marks */ +#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ + /* Bit 65 Vertical forms */ + /* CJK Compatibility Forms */ +#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */ + /* U+FE30-U+FE4F */ + /* Bit 66 Small Form Variants */ +#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ + /* Bit 67 Arabic Presentation Forms-B */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_B (1L << 3) /* U+FE70-U+FEFE */ + /* Bit 68 Halfwidth and Fullwidth Forms */ +#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ + /* Bit 69 Specials */ +#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ + /* Bit 70 Tibetan */ +#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ + /* Bit 71 Syriac */ +#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ + /* Bit 72 Thaana */ +#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ + /* Bit 73 Sinhala */ +#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ + /* Bit 74 Myanmar */ +#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ + /* Bit 75 Ethiopic */ + /* Ethiopic Supplement */ + /* Ethiopic Extended */ +#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ + /* U+1380-U+139F */ + /* U+2D80-U+2DDF */ + /* Bit 76 Cherokee */ +#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ + /* Bit 77 Unified Canadian Aboriginal Syllabics */ +#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ + /* Bit 78 Ogham */ +#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ + /* Bit 79 Runic */ +#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ + /* Bit 80 Khmer */ + /* Khmer Symbols */ +#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ + /* U+19E0-U+19FF */ + /* Bit 81 Mongolian */ +#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ + /* Bit 82 Braille Patterns */ +#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ + /* Bit 83 Yi Syllables */ + /* Yi Radicals */ +#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ + /* U+A490-U+A4CF */ + /* Bit 84 Tagalog */ + /* Hanunoo */ + /* Buhid */ + /* Tagbanwa */ +#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ + /* U+1720-U+173F */ + /* U+1740-U+175F */ + /* U+1760-U+177F */ + /* Bit 85 Old Italic */ +#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ + /* Bit 86 Gothic */ +#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ + /* Bit 87 Deseret */ +#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ + /* Bit 88 Byzantine Musical Symbols */ + /* Musical Symbols */ + /* Ancient Greek Musical Notation */ +#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ + /*U+1D100-U+1D1FF*/ + /*U+1D200-U+1D24F*/ + /* Bit 89 Mathematical Alphanumeric Symbols */ +#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ + /* Bit 90 Private Use (plane 15) */ + /* Private Use (plane 16) */ +#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ + /*U+100000-U+10FFFD*/ + /* Bit 91 Variation Selectors */ + /* Variation Selectors Supplement */ +#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ + /*U+E0100-U+E01EF*/ + /* Bit 92 Tags */ +#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ + /* Bit 93 Limbu */ +#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */ + /* Bit 94 Tai Le */ +#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ + /* Bit 95 New Tai Lue */ +#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ + + /* ulUnicodeRange4 */ + /* --------------- */ + + /* Bit 96 Buginese */ +#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ + /* Bit 97 Glagolitic */ +#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */ + /* Bit 98 Tifinagh */ +#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */ + /* Bit 99 Yijing Hexagram Symbols */ +#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */ + /* Bit 100 Syloti Nagri */ +#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */ + /* Bit 101 Linear B Syllabary */ + /* Linear B Ideograms */ + /* Aegean Numbers */ +#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/ + /*U+10080-U+100FF*/ + /*U+10100-U+1013F*/ + /* Bit 102 Ancient Greek Numbers */ +#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/ + /* Bit 103 Ugaritic */ +#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/ + /* Bit 104 Old Persian */ +#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/ + /* Bit 105 Shavian */ +#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/ + /* Bit 106 Osmanya */ +#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/ + /* Bit 107 Cypriot Syllabary */ +#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/ + /* Bit 108 Kharoshthi */ +#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/ + /* Bit 109 Tai Xuan Jing Symbols */ +#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/ + /* Bit 110 Cuneiform */ + /* Cuneiform Numbers and Punctuation */ +#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/ + /*U+12400-U+1247F*/ + /* Bit 111 Counting Rod Numerals */ +#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/ + /* Bit 112 Sundanese */ +#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */ + /* Bit 113 Lepcha */ +#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */ + /* Bit 114 Ol Chiki */ +#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */ + /* Bit 115 Saurashtra */ +#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */ + /* Bit 116 Kayah Li */ +#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */ + /* Bit 117 Rejang */ +#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */ + /* Bit 118 Cham */ +#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */ + /* Bit 119 Ancient Symbols */ +#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/ + /* Bit 120 Phaistos Disc */ +#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/ + /* Bit 121 Carian */ + /* Lycian */ + /* Lydian */ +#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/ + /*U+10280-U+1029F*/ + /*U+10920-U+1093F*/ + /* Bit 122 Domino Tiles */ + /* Mahjong Tiles */ +#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/ + /*U+1F000-U+1F02F*/ + /* Bit 123-127 Reserved for process-internal usage */ + + /* */ + + /* for backward compatibility with older FreeType versions */ +#define TT_UCR_ARABIC_PRESENTATION_A \ + TT_UCR_ARABIC_PRESENTATION_FORMS_A +#define TT_UCR_ARABIC_PRESENTATION_B \ + TT_UCR_ARABIC_PRESENTATION_FORMS_B + +#define TT_UCR_COMBINING_DIACRITICS \ + TT_UCR_COMBINING_DIACRITICAL_MARKS +#define TT_UCR_COMBINING_DIACRITICS_SYMB \ + TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB + + +FT_END_HEADER + +#endif /* TTNAMEID_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/tttables.h b/NothinFancy/dep/include/freetype/tttables.h new file mode 100644 index 0000000..c33d990 --- /dev/null +++ b/NothinFancy/dep/include/freetype/tttables.h @@ -0,0 +1,855 @@ +/**************************************************************************** + * + * tttables.h + * + * Basic SFNT/TrueType tables definitions and interface + * (specification only). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTTABLES_H_ +#define TTTABLES_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * truetype_tables + * + * @title: + * TrueType Tables + * + * @abstract: + * TrueType-specific table types and functions. + * + * @description: + * This section contains definitions of some basic tables specific to + * TrueType and OpenType as well as some routines used to access and + * process them. + * + * @order: + * TT_Header + * TT_HoriHeader + * TT_VertHeader + * TT_OS2 + * TT_Postscript + * TT_PCLT + * TT_MaxProfile + * + * FT_Sfnt_Tag + * FT_Get_Sfnt_Table + * FT_Load_Sfnt_Table + * FT_Sfnt_Table_Info + * + * FT_Get_CMap_Language_ID + * FT_Get_CMap_Format + * + * FT_PARAM_TAG_UNPATENTED_HINTING + * + */ + + + /************************************************************************** + * + * @struct: + * TT_Header + * + * @description: + * A structure to model a TrueType font header table. All fields follow + * the OpenType specification. The 64-bit timestamps are stored in + * two-element arrays `Created` and `Modified`, first the upper then + * the lower 32~bits. + */ + typedef struct TT_Header_ + { + FT_Fixed Table_Version; + FT_Fixed Font_Revision; + + FT_Long CheckSum_Adjust; + FT_Long Magic_Number; + + FT_UShort Flags; + FT_UShort Units_Per_EM; + + FT_ULong Created [2]; + FT_ULong Modified[2]; + + FT_Short xMin; + FT_Short yMin; + FT_Short xMax; + FT_Short yMax; + + FT_UShort Mac_Style; + FT_UShort Lowest_Rec_PPEM; + + FT_Short Font_Direction; + FT_Short Index_To_Loc_Format; + FT_Short Glyph_Data_Format; + + } TT_Header; + + + /************************************************************************** + * + * @struct: + * TT_HoriHeader + * + * @description: + * A structure to model a TrueType horizontal header, the 'hhea' table, + * as well as the corresponding horizontal metrics table, 'hmtx'. + * + * @fields: + * Version :: + * The table version. + * + * Ascender :: + * The font's ascender, i.e., the distance from the baseline to the + * top-most of all glyph points found in the font. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoAscender` field of the 'OS/2' table instead + * if you want the correct one. + * + * Descender :: + * The font's descender, i.e., the distance from the baseline to the + * bottom-most of all glyph points found in the font. It is negative. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoDescender` field of the 'OS/2' table + * instead if you want the correct one. + * + * Line_Gap :: + * The font's line gap, i.e., the distance to add to the ascender and + * descender to get the BTB, i.e., the baseline-to-baseline distance + * for the font. + * + * advance_Width_Max :: + * This field is the maximum of all advance widths found in the font. + * It can be used to compute the maximum width of an arbitrary string + * of text. + * + * min_Left_Side_Bearing :: + * The minimum left side bearing of all glyphs within the font. + * + * min_Right_Side_Bearing :: + * The minimum right side bearing of all glyphs within the font. + * + * xMax_Extent :: + * The maximum horizontal extent (i.e., the 'width' of a glyph's + * bounding box) for all glyphs in the font. + * + * caret_Slope_Rise :: + * The rise coefficient of the cursor's slope of the cursor + * (slope=rise/run). + * + * caret_Slope_Run :: + * The run coefficient of the cursor's slope. + * + * caret_Offset :: + * The cursor's offset for slanted fonts. + * + * Reserved :: + * 8~reserved bytes. + * + * metric_Data_Format :: + * Always~0. + * + * number_Of_HMetrics :: + * Number of HMetrics entries in the 'hmtx' table -- this value can be + * smaller than the total number of glyphs in the font. + * + * long_metrics :: + * A pointer into the 'hmtx' table. + * + * short_metrics :: + * A pointer into the 'hmtx' table. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `caret_Slope_Rise`, + * `caret_Slope_Run`, and `caret_Offset`. + */ + typedef struct TT_HoriHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Width_Max; /* advance width maximum */ + + FT_Short min_Left_Side_Bearing; /* minimum left-sb */ + FT_Short min_Right_Side_Bearing; /* minimum right-sb */ + FT_Short xMax_Extent; /* xmax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_HMetrics; + + /* The following fields are not defined by the OpenType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* 'hmtx' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_HoriHeader; + + + /************************************************************************** + * + * @struct: + * TT_VertHeader + * + * @description: + * A structure used to model a TrueType vertical header, the 'vhea' + * table, as well as the corresponding vertical metrics table, 'vmtx'. + * + * @fields: + * Version :: + * The table version. + * + * Ascender :: + * The font's ascender, i.e., the distance from the baseline to the + * top-most of all glyph points found in the font. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoAscender` field of the 'OS/2' table instead + * if you want the correct one. + * + * Descender :: + * The font's descender, i.e., the distance from the baseline to the + * bottom-most of all glyph points found in the font. It is negative. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoDescender` field of the 'OS/2' table + * instead if you want the correct one. + * + * Line_Gap :: + * The font's line gap, i.e., the distance to add to the ascender and + * descender to get the BTB, i.e., the baseline-to-baseline distance + * for the font. + * + * advance_Height_Max :: + * This field is the maximum of all advance heights found in the font. + * It can be used to compute the maximum height of an arbitrary string + * of text. + * + * min_Top_Side_Bearing :: + * The minimum top side bearing of all glyphs within the font. + * + * min_Bottom_Side_Bearing :: + * The minimum bottom side bearing of all glyphs within the font. + * + * yMax_Extent :: + * The maximum vertical extent (i.e., the 'height' of a glyph's + * bounding box) for all glyphs in the font. + * + * caret_Slope_Rise :: + * The rise coefficient of the cursor's slope of the cursor + * (slope=rise/run). + * + * caret_Slope_Run :: + * The run coefficient of the cursor's slope. + * + * caret_Offset :: + * The cursor's offset for slanted fonts. + * + * Reserved :: + * 8~reserved bytes. + * + * metric_Data_Format :: + * Always~0. + * + * number_Of_VMetrics :: + * Number of VMetrics entries in the 'vmtx' table -- this value can be + * smaller than the total number of glyphs in the font. + * + * long_metrics :: + * A pointer into the 'vmtx' table. + * + * short_metrics :: + * A pointer into the 'vmtx' table. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `Ascender`, `Descender`, + * `Line_Gap`, `caret_Slope_Rise`, `caret_Slope_Run`, and `caret_Offset`. + */ + typedef struct TT_VertHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Height_Max; /* advance height maximum */ + + FT_Short min_Top_Side_Bearing; /* minimum top-sb */ + FT_Short min_Bottom_Side_Bearing; /* minimum bottom-sb */ + FT_Short yMax_Extent; /* ymax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_VMetrics; + + /* The following fields are not defined by the OpenType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* 'vmtx' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_VertHeader; + + + /************************************************************************** + * + * @struct: + * TT_OS2 + * + * @description: + * A structure to model a TrueType 'OS/2' table. All fields comply to + * the OpenType specification. + * + * Note that we now support old Mac fonts that do not include an 'OS/2' + * table. In this case, the `version` field is always set to 0xFFFF. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `sCapHeight`, `sTypoAscender`, + * `sTypoDescender`, `sTypoLineGap`, `sxHeight`, `usWinAscent`, + * `usWinDescent`, `yStrikeoutPosition`, `yStrikeoutSize`, + * `ySubscriptXOffset`, `ySubScriptXSize`, `ySubscriptYOffset`, + * `ySubscriptYSize`, `ySuperscriptXOffset`, `ySuperscriptXSize`, + * `ySuperscriptYOffset`, and `ySuperscriptYSize`. + * + * Possible values for bits in the `ulUnicodeRangeX` fields are given by + * the @TT_UCR_XXX macros. + */ + + typedef struct TT_OS2_ + { + FT_UShort version; /* 0x0001 - more or 0xFFFF */ + FT_Short xAvgCharWidth; + FT_UShort usWeightClass; + FT_UShort usWidthClass; + FT_UShort fsType; + FT_Short ySubscriptXSize; + FT_Short ySubscriptYSize; + FT_Short ySubscriptXOffset; + FT_Short ySubscriptYOffset; + FT_Short ySuperscriptXSize; + FT_Short ySuperscriptYSize; + FT_Short ySuperscriptXOffset; + FT_Short ySuperscriptYOffset; + FT_Short yStrikeoutSize; + FT_Short yStrikeoutPosition; + FT_Short sFamilyClass; + + FT_Byte panose[10]; + + FT_ULong ulUnicodeRange1; /* Bits 0-31 */ + FT_ULong ulUnicodeRange2; /* Bits 32-63 */ + FT_ULong ulUnicodeRange3; /* Bits 64-95 */ + FT_ULong ulUnicodeRange4; /* Bits 96-127 */ + + FT_Char achVendID[4]; + + FT_UShort fsSelection; + FT_UShort usFirstCharIndex; + FT_UShort usLastCharIndex; + FT_Short sTypoAscender; + FT_Short sTypoDescender; + FT_Short sTypoLineGap; + FT_UShort usWinAscent; + FT_UShort usWinDescent; + + /* only version 1 and higher: */ + + FT_ULong ulCodePageRange1; /* Bits 0-31 */ + FT_ULong ulCodePageRange2; /* Bits 32-63 */ + + /* only version 2 and higher: */ + + FT_Short sxHeight; + FT_Short sCapHeight; + FT_UShort usDefaultChar; + FT_UShort usBreakChar; + FT_UShort usMaxContext; + + /* only version 5 and higher: */ + + FT_UShort usLowerOpticalPointSize; /* in twips (1/20th points) */ + FT_UShort usUpperOpticalPointSize; /* in twips (1/20th points) */ + + } TT_OS2; + + + /************************************************************************** + * + * @struct: + * TT_Postscript + * + * @description: + * A structure to model a TrueType 'post' table. All fields comply to + * the OpenType specification. This structure does not reference a + * font's PostScript glyph names; use @FT_Get_Glyph_Name to retrieve + * them. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `underlinePosition` and + * `underlineThickness`. + */ + typedef struct TT_Postscript_ + { + FT_Fixed FormatType; + FT_Fixed italicAngle; + FT_Short underlinePosition; + FT_Short underlineThickness; + FT_ULong isFixedPitch; + FT_ULong minMemType42; + FT_ULong maxMemType42; + FT_ULong minMemType1; + FT_ULong maxMemType1; + + /* Glyph names follow in the 'post' table, but we don't */ + /* load them by default. */ + + } TT_Postscript; + + + /************************************************************************** + * + * @struct: + * TT_PCLT + * + * @description: + * A structure to model a TrueType 'PCLT' table. All fields comply to + * the OpenType specification. + */ + typedef struct TT_PCLT_ + { + FT_Fixed Version; + FT_ULong FontNumber; + FT_UShort Pitch; + FT_UShort xHeight; + FT_UShort Style; + FT_UShort TypeFamily; + FT_UShort CapHeight; + FT_UShort SymbolSet; + FT_Char TypeFace[16]; + FT_Char CharacterComplement[8]; + FT_Char FileName[6]; + FT_Char StrokeWeight; + FT_Char WidthType; + FT_Byte SerifStyle; + FT_Byte Reserved; + + } TT_PCLT; + + + /************************************************************************** + * + * @struct: + * TT_MaxProfile + * + * @description: + * The maximum profile ('maxp') table contains many max values, which can + * be used to pre-allocate arrays for speeding up glyph loading and + * hinting. + * + * @fields: + * version :: + * The version number. + * + * numGlyphs :: + * The number of glyphs in this TrueType font. + * + * maxPoints :: + * The maximum number of points in a non-composite TrueType glyph. See + * also `maxCompositePoints`. + * + * maxContours :: + * The maximum number of contours in a non-composite TrueType glyph. + * See also `maxCompositeContours`. + * + * maxCompositePoints :: + * The maximum number of points in a composite TrueType glyph. See + * also `maxPoints`. + * + * maxCompositeContours :: + * The maximum number of contours in a composite TrueType glyph. See + * also `maxContours`. + * + * maxZones :: + * The maximum number of zones used for glyph hinting. + * + * maxTwilightPoints :: + * The maximum number of points in the twilight zone used for glyph + * hinting. + * + * maxStorage :: + * The maximum number of elements in the storage area used for glyph + * hinting. + * + * maxFunctionDefs :: + * The maximum number of function definitions in the TrueType bytecode + * for this font. + * + * maxInstructionDefs :: + * The maximum number of instruction definitions in the TrueType + * bytecode for this font. + * + * maxStackElements :: + * The maximum number of stack elements used during bytecode + * interpretation. + * + * maxSizeOfInstructions :: + * The maximum number of TrueType opcodes used for glyph hinting. + * + * maxComponentElements :: + * The maximum number of simple (i.e., non-composite) glyphs in a + * composite glyph. + * + * maxComponentDepth :: + * The maximum nesting depth of composite glyphs. + * + * @note: + * This structure is only used during font loading. + */ + typedef struct TT_MaxProfile_ + { + FT_Fixed version; + FT_UShort numGlyphs; + FT_UShort maxPoints; + FT_UShort maxContours; + FT_UShort maxCompositePoints; + FT_UShort maxCompositeContours; + FT_UShort maxZones; + FT_UShort maxTwilightPoints; + FT_UShort maxStorage; + FT_UShort maxFunctionDefs; + FT_UShort maxInstructionDefs; + FT_UShort maxStackElements; + FT_UShort maxSizeOfInstructions; + FT_UShort maxComponentElements; + FT_UShort maxComponentDepth; + + } TT_MaxProfile; + + + /************************************************************************** + * + * @enum: + * FT_Sfnt_Tag + * + * @description: + * An enumeration to specify indices of SFNT tables loaded and parsed by + * FreeType during initialization of an SFNT font. Used in the + * @FT_Get_Sfnt_Table API function. + * + * @values: + * FT_SFNT_HEAD :: + * To access the font's @TT_Header structure. + * + * FT_SFNT_MAXP :: + * To access the font's @TT_MaxProfile structure. + * + * FT_SFNT_OS2 :: + * To access the font's @TT_OS2 structure. + * + * FT_SFNT_HHEA :: + * To access the font's @TT_HoriHeader structure. + * + * FT_SFNT_VHEA :: + * To access the font's @TT_VertHeader structure. + * + * FT_SFNT_POST :: + * To access the font's @TT_Postscript structure. + * + * FT_SFNT_PCLT :: + * To access the font's @TT_PCLT structure. + */ + typedef enum FT_Sfnt_Tag_ + { + FT_SFNT_HEAD, + FT_SFNT_MAXP, + FT_SFNT_OS2, + FT_SFNT_HHEA, + FT_SFNT_VHEA, + FT_SFNT_POST, + FT_SFNT_PCLT, + + FT_SFNT_MAX + + } FT_Sfnt_Tag; + + /* these constants are deprecated; use the corresponding `FT_Sfnt_Tag` */ + /* values instead */ +#define ft_sfnt_head FT_SFNT_HEAD +#define ft_sfnt_maxp FT_SFNT_MAXP +#define ft_sfnt_os2 FT_SFNT_OS2 +#define ft_sfnt_hhea FT_SFNT_HHEA +#define ft_sfnt_vhea FT_SFNT_VHEA +#define ft_sfnt_post FT_SFNT_POST +#define ft_sfnt_pclt FT_SFNT_PCLT + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Table + * + * @description: + * Return a pointer to a given SFNT table stored within a face. + * + * @input: + * face :: + * A handle to the source. + * + * tag :: + * The index of the SFNT table. + * + * @return: + * A type-less pointer to the table. This will be `NULL` in case of + * error, or if the corresponding table was not found **OR** loaded from + * the file. + * + * Use a typecast according to `tag` to access the structure elements. + * + * @note: + * The table is owned by the face object and disappears with it. + * + * This function is only useful to access SFNT tables that are loaded by + * the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for a + * list. + * + * @example: + * Here is an example demonstrating access to the 'vhea' table. + * + * ``` + * TT_VertHeader* vert_header; + * + * + * vert_header = + * (TT_VertHeader*)FT_Get_Sfnt_Table( face, FT_SFNT_VHEA ); + * ``` + */ + FT_EXPORT( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ); + + + /************************************************************************** + * + * @function: + * FT_Load_Sfnt_Table + * + * @description: + * Load any SFNT font table into client memory. + * + * @input: + * face :: + * A handle to the source face. + * + * tag :: + * The four-byte tag of the table to load. Use value~0 if you want to + * access the whole font file. Otherwise, you can use one of the + * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new + * one with @FT_MAKE_TAG. + * + * offset :: + * The starting offset in the table (or file if tag~==~0). + * + * @output: + * buffer :: + * The target buffer address. The client must ensure that the memory + * array is big enough to hold the data. + * + * @inout: + * length :: + * If the `length` parameter is `NULL`, try to load the whole table. + * Return an error code if it fails. + * + * Else, if `*length` is~0, exit immediately while returning the + * table's (or file) full size in it. + * + * Else the number of bytes to read from the table or file, from the + * starting offset. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If you need to determine the table's length you should first call this + * function with `*length` set to~0, as in the following example: + * + * ``` + * FT_ULong length = 0; + * + * + * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + * if ( error ) { ... table does not exist ... } + * + * buffer = malloc( length ); + * if ( buffer == NULL ) { ... not enough memory ... } + * + * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + * if ( error ) { ... could not load table ... } + * ``` + * + * Note that structures like @TT_Header or @TT_OS2 can't be used with + * this function; they are limited to @FT_Get_Sfnt_Table. Reason is that + * those structures depend on the processor architecture, with varying + * size (e.g. 32bit vs. 64bit) or order (big endian vs. little endian). + * + */ + FT_EXPORT( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @function: + * FT_Sfnt_Table_Info + * + * @description: + * Return information on an SFNT table. + * + * @input: + * face :: + * A handle to the source face. + * + * table_index :: + * The index of an SFNT table. The function returns + * FT_Err_Table_Missing for an invalid value. + * + * @inout: + * tag :: + * The name tag of the SFNT table. If the value is `NULL`, + * `table_index` is ignored, and `length` returns the number of SFNT + * tables in the font. + * + * @output: + * length :: + * The length of the SFNT table (or the number of SFNT tables, + * depending on `tag`). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * While parsing fonts, FreeType handles SFNT tables with length zero as + * missing. + * + */ + FT_EXPORT( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ); + + + /************************************************************************** + * + * @function: + * FT_Get_CMap_Language_ID + * + * @description: + * Return cmap language ID as specified in the OpenType standard. + * Definitions of language ID values are in file @FT_TRUETYPE_IDS_H. + * + * @input: + * charmap :: + * The target charmap. + * + * @return: + * The language ID of `charmap`. If `charmap` doesn't belong to an SFNT + * face, just return~0 as the default value. + * + * For a format~14 cmap (to access Unicode IVS), the return value is + * 0xFFFFFFFF. + */ + FT_EXPORT( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_CMap_Format + * + * @description: + * Return the format of an SFNT 'cmap' table. + * + * @input: + * charmap :: + * The target charmap. + * + * @return: + * The format of `charmap`. If `charmap` doesn't belong to an SFNT face, + * return -1. + */ + FT_EXPORT( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ); + + /* */ + + +FT_END_HEADER + +#endif /* TTTABLES_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/freetype/tttags.h b/NothinFancy/dep/include/freetype/tttags.h new file mode 100644 index 0000000..47ccc6d --- /dev/null +++ b/NothinFancy/dep/include/freetype/tttags.h @@ -0,0 +1,123 @@ +/**************************************************************************** + * + * tttags.h + * + * Tags for TrueType and OpenType tables (specification only). + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTAGS_H_ +#define TTAGS_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + +#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) +#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) +#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) +#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) +#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) +#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) +#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) +#define TTAG_CBDT FT_MAKE_TAG( 'C', 'B', 'D', 'T' ) +#define TTAG_CBLC FT_MAKE_TAG( 'C', 'B', 'L', 'C' ) +#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_CFF2 FT_MAKE_TAG( 'C', 'F', 'F', '2' ) +#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) +#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) +#define TTAG_COLR FT_MAKE_TAG( 'C', 'O', 'L', 'R' ) +#define TTAG_CPAL FT_MAKE_TAG( 'C', 'P', 'A', 'L' ) +#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) +#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) +#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) +#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) +#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) +#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) +#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) +#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) +#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) +#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) +#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) +#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) +#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) +#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) +#define TTAG_HVAR FT_MAKE_TAG( 'H', 'V', 'A', 'R' ) +#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) +#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) +#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) +#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) +#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) +#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) +#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) +#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) +#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) +#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) +#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) +#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' ) +#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) +#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) +#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) +#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) +#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) +#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) +#define TTAG_MVAR FT_MAKE_TAG( 'M', 'V', 'A', 'R' ) +#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) +#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) +#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) +#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) +#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) +#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) +#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) +#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) +#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) +#define TTAG_sbix FT_MAKE_TAG( 's', 'b', 'i', 'x' ) +#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' ) +#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) +#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) +#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) +#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) +#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) +#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' ) +#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' ) +#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) +#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) +#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) +#define TTAG_VVAR FT_MAKE_TAG( 'V', 'V', 'A', 'R' ) +#define TTAG_wOFF FT_MAKE_TAG( 'w', 'O', 'F', 'F' ) +#define TTAG_wOF2 FT_MAKE_TAG( 'w', 'O', 'F', '2' ) + +/* used by "Keyboard.dfont" on legacy Mac OS X */ +#define TTAG_0xA5kbd FT_MAKE_TAG( 0xA5, 'k', 'b', 'd' ) + +/* used by "LastResort.dfont" on legacy Mac OS X */ +#define TTAG_0xA5lst FT_MAKE_TAG( 0xA5, 'l', 's', 't' ) + + +FT_END_HEADER + +#endif /* TTAGS_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/ft2build.h b/NothinFancy/dep/include/ft2build.h new file mode 100644 index 0000000..62686b1 --- /dev/null +++ b/NothinFancy/dep/include/ft2build.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * ft2build.h + * + * FreeType 2 build and setup macros. + * + * Copyright (C) 1996-2021 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This is the 'entry point' for FreeType header file inclusions, to be + * loaded before all other header files. + * + * A typical example is + * + * ``` + * #include + * #include + * ``` + * + */ + + +#ifndef FT2BUILD_H_ +#define FT2BUILD_H_ + +#include + +#endif /* FT2BUILD_H_ */ + + +/* END */ diff --git a/NothinFancy/dep/include/glm/CMakeLists.txt b/NothinFancy/dep/include/glm/CMakeLists.txt new file mode 100644 index 0000000..4ff51c8 --- /dev/null +++ b/NothinFancy/dep/include/glm/CMakeLists.txt @@ -0,0 +1,70 @@ +file(GLOB ROOT_SOURCE *.cpp) +file(GLOB ROOT_INLINE *.inl) +file(GLOB ROOT_HEADER *.hpp) +file(GLOB ROOT_TEXT ../*.txt) +file(GLOB ROOT_MD ../*.md) +file(GLOB ROOT_NAT ../util/glm.natvis) + +file(GLOB_RECURSE CORE_SOURCE ./detail/*.cpp) +file(GLOB_RECURSE CORE_INLINE ./detail/*.inl) +file(GLOB_RECURSE CORE_HEADER ./detail/*.hpp) + +file(GLOB_RECURSE EXT_SOURCE ./ext/*.cpp) +file(GLOB_RECURSE EXT_INLINE ./ext/*.inl) +file(GLOB_RECURSE EXT_HEADER ./ext/*.hpp) + +file(GLOB_RECURSE GTC_SOURCE ./gtc/*.cpp) +file(GLOB_RECURSE GTC_INLINE ./gtc/*.inl) +file(GLOB_RECURSE GTC_HEADER ./gtc/*.hpp) + +file(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp) +file(GLOB_RECURSE GTX_INLINE ./gtx/*.inl) +file(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp) + +file(GLOB_RECURSE SIMD_SOURCE ./simd/*.cpp) +file(GLOB_RECURSE SIMD_INLINE ./simd/*.inl) +file(GLOB_RECURSE SIMD_HEADER ./simd/*.h) + +source_group("Text Files" FILES ${ROOT_TEXT} ${ROOT_MD}) +source_group("Core Files" FILES ${CORE_SOURCE}) +source_group("Core Files" FILES ${CORE_INLINE}) +source_group("Core Files" FILES ${CORE_HEADER}) +source_group("EXT Files" FILES ${EXT_SOURCE}) +source_group("EXT Files" FILES ${EXT_INLINE}) +source_group("EXT Files" FILES ${EXT_HEADER}) +source_group("GTC Files" FILES ${GTC_SOURCE}) +source_group("GTC Files" FILES ${GTC_INLINE}) +source_group("GTC Files" FILES ${GTC_HEADER}) +source_group("GTX Files" FILES ${GTX_SOURCE}) +source_group("GTX Files" FILES ${GTX_INLINE}) +source_group("GTX Files" FILES ${GTX_HEADER}) +source_group("SIMD Files" FILES ${SIMD_SOURCE}) +source_group("SIMD Files" FILES ${SIMD_INLINE}) +source_group("SIMD Files" FILES ${SIMD_HEADER}) + +add_library(glm INTERFACE) +target_include_directories(glm INTERFACE ../) + +if(BUILD_STATIC_LIBS) +add_library(glm_static STATIC ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT} + ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} + ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} + ${EXT_SOURCE} ${EXT_INLINE} ${EXT_HEADER} + ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} + ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER} + ${SIMD_SOURCE} ${SIMD_INLINE} ${SIMD_HEADER}) + target_link_libraries(glm_static PUBLIC glm) + add_library(glm::glm_static ALIAS glm_static) +endif() + +if(BUILD_SHARED_LIBS) +add_library(glm_shared SHARED ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT} + ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} + ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} + ${EXT_SOURCE} ${EXT_INLINE} ${EXT_HEADER} + ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} + ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER} + ${SIMD_SOURCE} ${SIMD_INLINE} ${SIMD_HEADER}) + target_link_libraries(glm_shared PUBLIC glm) + add_library(glm::glm_shared ALIAS glm_shared) +endif() diff --git a/NothinFancy/dep/include/glm/common.hpp b/NothinFancy/dep/include/glm/common.hpp new file mode 100644 index 0000000..0328dc9 --- /dev/null +++ b/NothinFancy/dep/include/glm/common.hpp @@ -0,0 +1,539 @@ +/// @ref core +/// @file glm/common.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.3 Common Functions +/// +/// @defgroup core_func_common Common functions +/// @ingroup core +/// +/// Provides GLSL common functions +/// +/// These all operate component-wise. The description is per component. +/// +/// Include to use these core features. + +#pragma once + +#include "detail/qualifier.hpp" +#include "detail/_fixes.hpp" + +namespace glm +{ + /// @addtogroup core_func_common + /// @{ + + /// Returns x if x >= 0; otherwise, it returns -x. + /// + /// @tparam genType floating-point or signed integer; scalar or vector types. + /// + /// @see GLSL abs man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR genType abs(genType x); + + /// Returns x if x >= 0; otherwise, it returns -x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL abs man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec abs(vec const& x); + + /// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL sign man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec sign(vec const& x); + + /// Returns a value equal to the nearest integer that is less then or equal to x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL floor man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec floor(vec const& x); + + /// Returns a value equal to the nearest integer to x + /// whose absolute value is not larger than the absolute value of x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL trunc man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec trunc(vec const& x); + + /// Returns a value equal to the nearest integer to x. + /// The fraction 0.5 will round in a direction chosen by the + /// implementation, presumably the direction that is fastest. + /// This includes the possibility that round(x) returns the + /// same value as roundEven(x) for all values of x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL round man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec round(vec const& x); + + /// Returns a value equal to the nearest integer to x. + /// A fractional part of 0.5 will round toward the nearest even + /// integer. (Both 3.5 and 4.5 for x will return 4.0.) + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL roundEven man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + /// @see New round to even technique + template + GLM_FUNC_DECL vec roundEven(vec const& x); + + /// Returns a value equal to the nearest integer + /// that is greater than or equal to x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL ceil man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec ceil(vec const& x); + + /// Return x - floor(x). + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL fract man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType fract(genType x); + + /// Return x - floor(x). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL fract man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec fract(vec const& x); + + template + GLM_FUNC_DECL genType mod(genType x, genType y); + + template + GLM_FUNC_DECL vec mod(vec const& x, T y); + + /// Modulus. Returns x - y * floor(x / y) + /// for each component in x using the floating point value y. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types, include glm/gtc/integer for integer scalar types support + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL mod man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec mod(vec const& x, vec const& y); + + /// Returns the fractional part of x and sets i to the integer + /// part (as a whole number floating point value). Both the + /// return value and the output parameter will have the same + /// sign as x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL modf man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType modf(genType x, genType& i); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see GLSL min man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR genType min(genType x, genType y); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL min man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec min(vec const& x, T y); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL min man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec min(vec const& x, vec const& y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see GLSL max man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR genType max(genType x, genType y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL max man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec max(vec const& x, T y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL max man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec max(vec const& x, vec const& y); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see GLSL clamp man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR genType clamp(genType x, genType minVal, genType maxVal); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL clamp man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec clamp(vec const& x, T minVal, T maxVal); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL clamp man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec clamp(vec const& x, vec const& minVal, vec const& maxVal); + + /// If genTypeU is a floating scalar or vector: + /// Returns x * (1.0 - a) + y * a, i.e., the linear blend of + /// x and y using the floating-point value a. + /// The value for a is not restricted to the range [0, 1]. + /// + /// If genTypeU is a boolean scalar or vector: + /// Selects which vector each returned component comes + /// from. For a component of 'a' that is false, the + /// corresponding component of 'x' is returned. For a + /// component of 'a' that is true, the corresponding + /// component of 'y' is returned. Components of 'x' and 'y' that + /// are not selected are allowed to be invalid floating point + /// values and will have no effect on the results. Thus, this + /// provides different functionality than + /// genType mix(genType x, genType y, genType(a)) + /// where a is a Boolean vector. + /// + /// @see GLSL mix man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + /// + /// @param[in] x Value to interpolate. + /// @param[in] y Value to interpolate. + /// @param[in] a Interpolant. + /// + /// @tparam genTypeT Floating point scalar or vector. + /// @tparam genTypeU Floating point or boolean scalar or vector. It can't be a vector if it is the length of genTypeT. + /// + /// @code + /// #include + /// ... + /// float a; + /// bool b; + /// glm::dvec3 e; + /// glm::dvec3 f; + /// glm::vec4 g; + /// glm::vec4 h; + /// ... + /// glm::vec4 r = glm::mix(g, h, a); // Interpolate with a floating-point scalar two vectors. + /// glm::vec4 s = glm::mix(g, h, b); // Returns g or h; + /// glm::dvec3 t = glm::mix(e, f, a); // Types of the third parameter is not required to match with the first and the second. + /// glm::vec4 u = glm::mix(g, h, r); // Interpolations can be perform per component with a vector for the last parameter. + /// @endcode + template + GLM_FUNC_DECL genTypeT mix(genTypeT x, genTypeT y, genTypeU a); + + template + GLM_FUNC_DECL vec mix(vec const& x, vec const& y, vec const& a); + + template + GLM_FUNC_DECL vec mix(vec const& x, vec const& y, U a); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0 for each component of a genType. + /// + /// @see GLSL step man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType step(genType edge, genType x); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL step man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec step(T edge, vec const& x); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL step man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec step(vec const& edge, vec const& x); + + /// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and + /// performs smooth Hermite interpolation between 0 and 1 + /// when edge0 < x < edge1. This is useful in cases where + /// you would want a threshold function with a smooth + /// transition. This is equivalent to: + /// genType t; + /// t = clamp ((x - edge0) / (edge1 - edge0), 0, 1); + /// return t * t * (3 - 2 * t); + /// Results are undefined if edge0 >= edge1. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL smoothstep man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType smoothstep(genType edge0, genType edge1, genType x); + + template + GLM_FUNC_DECL vec smoothstep(T edge0, T edge1, vec const& x); + + template + GLM_FUNC_DECL vec smoothstep(vec const& edge0, vec const& edge1, vec const& x); + + /// Returns true if x holds a NaN (not a number) + /// representation in the underlying implementation's set of + /// floating point representations. Returns false otherwise, + /// including for implementations with no NaN + /// representations. + /// + /// /!\ When using compiler fast math, this function may fail. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL isnan man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec isnan(vec const& x); + + /// Returns true if x holds a positive infinity or negative + /// infinity representation in the underlying implementation's + /// set of floating point representations. Returns false + /// otherwise, including for implementations with no infinity + /// representations. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL isinf man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec isinf(vec const& x); + + /// Returns a signed integer value representing + /// the encoding of a floating-point value. The floating-point + /// value's bit-level representation is preserved. + /// + /// @see GLSL floatBitsToInt man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + GLM_FUNC_DECL int floatBitsToInt(float const& v); + + /// Returns a signed integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL floatBitsToInt man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec floatBitsToInt(vec const& v); + + /// Returns a unsigned integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @see GLSL floatBitsToUint man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + GLM_FUNC_DECL uint floatBitsToUint(float const& v); + + /// Returns a unsigned integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL floatBitsToUint man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec floatBitsToUint(vec const& v); + + /// Returns a floating-point value corresponding to a signed + /// integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @see GLSL intBitsToFloat man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + GLM_FUNC_DECL float intBitsToFloat(int const& v); + + /// Returns a floating-point value corresponding to a signed + /// integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL intBitsToFloat man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec intBitsToFloat(vec const& v); + + /// Returns a floating-point value corresponding to a + /// unsigned integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @see GLSL uintBitsToFloat man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + GLM_FUNC_DECL float uintBitsToFloat(uint const& v); + + /// Returns a floating-point value corresponding to a + /// unsigned integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL uintBitsToFloat man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec uintBitsToFloat(vec const& v); + + /// Computes and returns a * b + c. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL fma man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType fma(genType const& a, genType const& b, genType const& c); + + /// Splits x into a floating-point significand in the range + /// [0.5, 1.0) and an integral exponent of two, such that: + /// x = significand * exp(2, exponent) + /// + /// The significand is returned by the function and the + /// exponent is returned in the parameter exp. For a + /// floating-point value of zero, the significant and exponent + /// are both zero. For a floating-point value that is an + /// infinity or is not a number, the results are undefined. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL frexp man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType frexp(genType x, int& exp); + + template + GLM_FUNC_DECL vec frexp(vec const& v, vec& exp); + + /// Builds a floating-point number from x and the + /// corresponding integral exponent of two in exp, returning: + /// significand * exp(2, exponent) + /// + /// If this product is too large to be represented in the + /// floating-point type, the result is undefined. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL ldexp man page; + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType ldexp(genType const& x, int const& exp); + + template + GLM_FUNC_DECL vec ldexp(vec const& v, vec const& exp); + + /// @} +}//namespace glm + +#include "detail/func_common.inl" + diff --git a/NothinFancy/dep/include/glm/detail/_features.hpp b/NothinFancy/dep/include/glm/detail/_features.hpp new file mode 100644 index 0000000..b0cbe9f --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/_features.hpp @@ -0,0 +1,394 @@ +#pragma once + +// #define GLM_CXX98_EXCEPTIONS +// #define GLM_CXX98_RTTI + +// #define GLM_CXX11_RVALUE_REFERENCES +// Rvalue references - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html + +// GLM_CXX11_TRAILING_RETURN +// Rvalue references for *this - GCC not supported +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm + +// GLM_CXX11_NONSTATIC_MEMBER_INIT +// Initialization of class objects by rvalues - GCC any +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1610.html + +// GLM_CXX11_NONSTATIC_MEMBER_INIT +// Non-static data member initializers - GCC 4.7 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm + +// #define GLM_CXX11_VARIADIC_TEMPLATE +// Variadic templates - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf + +// +// Extending variadic template template parameters - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf + +// #define GLM_CXX11_GENERALIZED_INITIALIZERS +// Initializer lists - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm + +// #define GLM_CXX11_STATIC_ASSERT +// Static assertions - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html + +// #define GLM_CXX11_AUTO_TYPE +// auto-typed variables - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf + +// #define GLM_CXX11_AUTO_TYPE +// Multi-declarator auto - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1737.pdf + +// #define GLM_CXX11_AUTO_TYPE +// Removal of auto as a storage-class specifier - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm + +// #define GLM_CXX11_AUTO_TYPE +// New function declarator syntax - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm + +// #define GLM_CXX11_LAMBDAS +// New wording for C++0x lambdas - GCC 4.5 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2927.pdf + +// #define GLM_CXX11_DECLTYPE +// Declared type of an expression - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf + +// +// Right angle brackets - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html + +// +// Default template arguments for function templates DR226 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226 + +// +// Solving the SFINAE problem for expressions DR339 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html + +// #define GLM_CXX11_ALIAS_TEMPLATE +// Template aliases N2258 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf + +// +// Extern templates N1987 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm + +// #define GLM_CXX11_NULLPTR +// Null pointer constant N2431 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf + +// #define GLM_CXX11_STRONG_ENUMS +// Strongly-typed enums N2347 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf + +// +// Forward declarations for enums N2764 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf + +// +// Generalized attributes N2761 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf + +// +// Generalized constant expressions N2235 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf + +// +// Alignment support N2341 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf + +// #define GLM_CXX11_DELEGATING_CONSTRUCTORS +// Delegating constructors N1986 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf + +// +// Inheriting constructors N2540 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm + +// #define GLM_CXX11_EXPLICIT_CONVERSIONS +// Explicit conversion operators N2437 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf + +// +// New character types N2249 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html + +// +// Unicode string literals N2442 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm + +// +// Raw string literals N2442 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm + +// +// Universal character name literals N2170 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html + +// #define GLM_CXX11_USER_LITERALS +// User-defined literals N2765 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf + +// +// Standard Layout Types N2342 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm + +// #define GLM_CXX11_DEFAULTED_FUNCTIONS +// #define GLM_CXX11_DELETED_FUNCTIONS +// Defaulted and deleted functions N2346 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm + +// +// Extended friend declarations N1791 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf + +// +// Extending sizeof N2253 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html + +// #define GLM_CXX11_INLINE_NAMESPACES +// Inline namespaces N2535 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm + +// #define GLM_CXX11_UNRESTRICTED_UNIONS +// Unrestricted unions N2544 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf + +// #define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS +// Local and unnamed types as template arguments N2657 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm + +// #define GLM_CXX11_RANGE_FOR +// Range-based for N2930 GCC 4.6 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2930.html + +// #define GLM_CXX11_OVERRIDE_CONTROL +// Explicit virtual overrides N2928 N3206 N3272 GCC 4.7 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2928.htm +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm + +// +// Minimal support for garbage collection and reachability-based leak detection N2670 No +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm + +// #define GLM_CXX11_NOEXCEPT +// Allowing move constructors to throw [noexcept] N3050 GCC 4.6 (core language only) +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html + +// +// Defining move special member functions N3053 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html + +// +// Sequence points N2239 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html + +// +// Atomic operations N2427 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html + +// +// Strong Compare and Exchange N2748 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html + +// +// Bidirectional Fences N2752 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2752.htm + +// +// Memory model N2429 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2429.htm + +// +// Data-dependency ordering: atomics and memory model N2664 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm + +// +// Propagating exceptions N2179 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html + +// +// Abandoning a process and at_quick_exit N2440 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2440.htm + +// +// Allow atomics use in signal handlers N2547 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2547.htm + +// +// Thread-local storage N2659 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm + +// +// Dynamic initialization and destruction with concurrency N2660 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm + +// +// __func__ predefined identifier N2340 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm + +// +// C99 preprocessor N1653 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm + +// +// long long N1811 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf + +// +// Extended integral types N1988 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf + +#if(GLM_COMPILER & GLM_COMPILER_GCC) + +# define GLM_CXX11_STATIC_ASSERT + +#elif(GLM_COMPILER & GLM_COMPILER_CLANG) +# if(__has_feature(cxx_exceptions)) +# define GLM_CXX98_EXCEPTIONS +# endif + +# if(__has_feature(cxx_rtti)) +# define GLM_CXX98_RTTI +# endif + +# if(__has_feature(cxx_access_control_sfinae)) +# define GLM_CXX11_ACCESS_CONTROL_SFINAE +# endif + +# if(__has_feature(cxx_alias_templates)) +# define GLM_CXX11_ALIAS_TEMPLATE +# endif + +# if(__has_feature(cxx_alignas)) +# define GLM_CXX11_ALIGNAS +# endif + +# if(__has_feature(cxx_attributes)) +# define GLM_CXX11_ATTRIBUTES +# endif + +# if(__has_feature(cxx_constexpr)) +# define GLM_CXX11_CONSTEXPR +# endif + +# if(__has_feature(cxx_decltype)) +# define GLM_CXX11_DECLTYPE +# endif + +# if(__has_feature(cxx_default_function_template_args)) +# define GLM_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS +# endif + +# if(__has_feature(cxx_defaulted_functions)) +# define GLM_CXX11_DEFAULTED_FUNCTIONS +# endif + +# if(__has_feature(cxx_delegating_constructors)) +# define GLM_CXX11_DELEGATING_CONSTRUCTORS +# endif + +# if(__has_feature(cxx_deleted_functions)) +# define GLM_CXX11_DELETED_FUNCTIONS +# endif + +# if(__has_feature(cxx_explicit_conversions)) +# define GLM_CXX11_EXPLICIT_CONVERSIONS +# endif + +# if(__has_feature(cxx_generalized_initializers)) +# define GLM_CXX11_GENERALIZED_INITIALIZERS +# endif + +# if(__has_feature(cxx_implicit_moves)) +# define GLM_CXX11_IMPLICIT_MOVES +# endif + +# if(__has_feature(cxx_inheriting_constructors)) +# define GLM_CXX11_INHERITING_CONSTRUCTORS +# endif + +# if(__has_feature(cxx_inline_namespaces)) +# define GLM_CXX11_INLINE_NAMESPACES +# endif + +# if(__has_feature(cxx_lambdas)) +# define GLM_CXX11_LAMBDAS +# endif + +# if(__has_feature(cxx_local_type_template_args)) +# define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS +# endif + +# if(__has_feature(cxx_noexcept)) +# define GLM_CXX11_NOEXCEPT +# endif + +# if(__has_feature(cxx_nonstatic_member_init)) +# define GLM_CXX11_NONSTATIC_MEMBER_INIT +# endif + +# if(__has_feature(cxx_nullptr)) +# define GLM_CXX11_NULLPTR +# endif + +# if(__has_feature(cxx_override_control)) +# define GLM_CXX11_OVERRIDE_CONTROL +# endif + +# if(__has_feature(cxx_reference_qualified_functions)) +# define GLM_CXX11_REFERENCE_QUALIFIED_FUNCTIONS +# endif + +# if(__has_feature(cxx_range_for)) +# define GLM_CXX11_RANGE_FOR +# endif + +# if(__has_feature(cxx_raw_string_literals)) +# define GLM_CXX11_RAW_STRING_LITERALS +# endif + +# if(__has_feature(cxx_rvalue_references)) +# define GLM_CXX11_RVALUE_REFERENCES +# endif + +# if(__has_feature(cxx_static_assert)) +# define GLM_CXX11_STATIC_ASSERT +# endif + +# if(__has_feature(cxx_auto_type)) +# define GLM_CXX11_AUTO_TYPE +# endif + +# if(__has_feature(cxx_strong_enums)) +# define GLM_CXX11_STRONG_ENUMS +# endif + +# if(__has_feature(cxx_trailing_return)) +# define GLM_CXX11_TRAILING_RETURN +# endif + +# if(__has_feature(cxx_unicode_literals)) +# define GLM_CXX11_UNICODE_LITERALS +# endif + +# if(__has_feature(cxx_unrestricted_unions)) +# define GLM_CXX11_UNRESTRICTED_UNIONS +# endif + +# if(__has_feature(cxx_user_literals)) +# define GLM_CXX11_USER_LITERALS +# endif + +# if(__has_feature(cxx_variadic_templates)) +# define GLM_CXX11_VARIADIC_TEMPLATES +# endif + +#endif//(GLM_COMPILER & GLM_COMPILER_CLANG) diff --git a/NothinFancy/dep/include/glm/detail/_fixes.hpp b/NothinFancy/dep/include/glm/detail/_fixes.hpp new file mode 100644 index 0000000..a503c7c --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/_fixes.hpp @@ -0,0 +1,27 @@ +#include + +//! Workaround for compatibility with other libraries +#ifdef max +#undef max +#endif + +//! Workaround for compatibility with other libraries +#ifdef min +#undef min +#endif + +//! Workaround for Android +#ifdef isnan +#undef isnan +#endif + +//! Workaround for Android +#ifdef isinf +#undef isinf +#endif + +//! Workaround for Chrone Native Client +#ifdef log2 +#undef log2 +#endif + diff --git a/NothinFancy/dep/include/glm/detail/_noise.hpp b/NothinFancy/dep/include/glm/detail/_noise.hpp new file mode 100644 index 0000000..5a874a0 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/_noise.hpp @@ -0,0 +1,81 @@ +#pragma once + +#include "../common.hpp" + +namespace glm{ +namespace detail +{ + template + GLM_FUNC_QUALIFIER T mod289(T const& x) + { + return x - floor(x * (static_cast(1.0) / static_cast(289.0))) * static_cast(289.0); + } + + template + GLM_FUNC_QUALIFIER T permute(T const& x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> permute(vec<2, T, Q> const& x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> permute(vec<3, T, Q> const& x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> permute(vec<4, T, Q> const& x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER T taylorInvSqrt(T const& r) + { + return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> taylorInvSqrt(vec<2, T, Q> const& r) + { + return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> taylorInvSqrt(vec<3, T, Q> const& r) + { + return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> taylorInvSqrt(vec<4, T, Q> const& r) + { + return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> fade(vec<2, T, Q> const& t) + { + return (t * t * t) * (t * (t * static_cast(6) - static_cast(15)) + static_cast(10)); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> fade(vec<3, T, Q> const& t) + { + return (t * t * t) * (t * (t * static_cast(6) - static_cast(15)) + static_cast(10)); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> fade(vec<4, T, Q> const& t) + { + return (t * t * t) * (t * (t * static_cast(6) - static_cast(15)) + static_cast(10)); + } +}//namespace detail +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/detail/_swizzle.hpp b/NothinFancy/dep/include/glm/detail/_swizzle.hpp new file mode 100644 index 0000000..87896ef --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/_swizzle.hpp @@ -0,0 +1,804 @@ +#pragma once + +namespace glm{ +namespace detail +{ + // Internal class for implementing swizzle operators + template + struct _swizzle_base0 + { + protected: + GLM_FUNC_QUALIFIER T& elem(size_t i){ return (reinterpret_cast(_buffer))[i]; } + GLM_FUNC_QUALIFIER T const& elem(size_t i) const{ return (reinterpret_cast(_buffer))[i]; } + + // Use an opaque buffer to *ensure* the compiler doesn't call a constructor. + // The size 1 buffer is assumed to aligned to the actual members so that the + // elem() + char _buffer[1]; + }; + + template + struct _swizzle_base1 : public _swizzle_base0 + { + }; + + template + struct _swizzle_base1<2, T, Q, E0,E1,-1,-2, Aligned> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<2, T, Q> operator ()() const { return vec<2, T, Q>(this->elem(E0), this->elem(E1)); } + }; + + template + struct _swizzle_base1<3, T, Q, E0,E1,E2,-1, Aligned> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<3, T, Q> operator ()() const { return vec<3, T, Q>(this->elem(E0), this->elem(E1), this->elem(E2)); } + }; + + template + struct _swizzle_base1<4, T, Q, E0,E1,E2,E3, Aligned> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<4, T, Q> operator ()() const { return vec<4, T, Q>(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } + }; + + // Internal class for implementing swizzle operators + /* + Template parameters: + + T = type of scalar values (e.g. float, double) + N = number of components in the vector (e.g. 3) + E0...3 = what index the n-th element of this swizzle refers to in the unswizzled vec + + DUPLICATE_ELEMENTS = 1 if there is a repeated element, 0 otherwise (used to specialize swizzles + containing duplicate elements so that they cannot be used as r-values). + */ + template + struct _swizzle_base2 : public _swizzle_base1::value> + { + struct op_equal + { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) const{ e = t; } + }; + + struct op_minus + { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) const{ e -= t; } + }; + + struct op_plus + { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) const{ e += t; } + }; + + struct op_mul + { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) const{ e *= t; } + }; + + struct op_div + { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) const{ e /= t; } + }; + + public: + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (const T& t) + { + for (int i = 0; i < N; ++i) + (*this)[i] = t; + return *this; + } + + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (vec const& that) + { + _apply_op(that, op_equal()); + return *this; + } + + GLM_FUNC_QUALIFIER void operator -= (vec const& that) + { + _apply_op(that, op_minus()); + } + + GLM_FUNC_QUALIFIER void operator += (vec const& that) + { + _apply_op(that, op_plus()); + } + + GLM_FUNC_QUALIFIER void operator *= (vec const& that) + { + _apply_op(that, op_mul()); + } + + GLM_FUNC_QUALIFIER void operator /= (vec const& that) + { + _apply_op(that, op_div()); + } + + GLM_FUNC_QUALIFIER T& operator[](size_t i) + { + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + GLM_FUNC_QUALIFIER T operator[](size_t i) const + { + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + + protected: + template + GLM_FUNC_QUALIFIER void _apply_op(vec const& that, const U& op) + { + // Make a copy of the data in this == &that. + // The copier should optimize out the copy in cases where the function is + // properly inlined and the copy is not necessary. + T t[N]; + for (int i = 0; i < N; ++i) + t[i] = that[i]; + for (int i = 0; i < N; ++i) + op( (*this)[i], t[i] ); + } + }; + + // Specialization for swizzles containing duplicate elements. These cannot be modified. + template + struct _swizzle_base2 : public _swizzle_base1::value> + { + struct Stub {}; + + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (Stub const&) { return *this; } + + GLM_FUNC_QUALIFIER T operator[] (size_t i) const + { + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + }; + + template + struct _swizzle : public _swizzle_base2 + { + typedef _swizzle_base2 base_type; + + using base_type::operator=; + + GLM_FUNC_QUALIFIER operator vec () const { return (*this)(); } + }; + +// +// To prevent the C++ syntax from getting entirely overwhelming, define some alias macros +// +#define GLM_SWIZZLE_TEMPLATE1 template +#define GLM_SWIZZLE_TEMPLATE2 template +#define GLM_SWIZZLE_TYPE1 _swizzle +#define GLM_SWIZZLE_TYPE2 _swizzle + +// +// Wrapper for a binary operator (e.g. u.yy + v.zy) +// +#define GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER vec operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b) \ + { \ + return a() OPERAND b(); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const vec& b) \ + { \ + return a() OPERAND b; \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec operator OPERAND ( const vec& a, const GLM_SWIZZLE_TYPE1& b) \ + { \ + return a OPERAND b(); \ + } + +// +// Wrapper for a operand between a swizzle and a binary (e.g. 1.0f - u.xyz) +// +#define GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const T& b) \ + { \ + return a() OPERAND b; \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec operator OPERAND ( const T& a, const GLM_SWIZZLE_TYPE1& b) \ + { \ + return a OPERAND b(); \ + } + +// +// Macro for wrapping a function taking one argument (e.g. abs()) +// +#define GLM_SWIZZLE_FUNCTION_1_ARGS(RETURN_TYPE,FUNCTION) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a) \ + { \ + return FUNCTION(a()); \ + } + +// +// Macro for wrapping a function taking two vector arguments (e.g. dot()). +// +#define GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE,FUNCTION) \ + GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b) \ + { \ + return FUNCTION(a(), b()); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE1& b) \ + { \ + return FUNCTION(a(), b()); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const typename V& b) \ + { \ + return FUNCTION(a(), b); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const V& a, const GLM_SWIZZLE_TYPE1& b) \ + { \ + return FUNCTION(a, b()); \ + } + +// +// Macro for wrapping a function take 2 vec arguments followed by a scalar (e.g. mix()). +// +#define GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(RETURN_TYPE,FUNCTION) \ + GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b, const T& c) \ + { \ + return FUNCTION(a(), b(), c); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE1& b, const T& c) \ + { \ + return FUNCTION(a(), b(), c); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const typename S0::vec_type& b, const T& c)\ + { \ + return FUNCTION(a(), b, c); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const typename V& a, const GLM_SWIZZLE_TYPE1& b, const T& c) \ + { \ + return FUNCTION(a, b(), c); \ + } + +}//namespace detail +}//namespace glm + +namespace glm +{ + namespace detail + { + GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(-) + GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(*) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(+) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(-) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(*) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(/) + } + + // + // Swizzles are distinct types from the unswizzled type. The below macros will + // provide template specializations for the swizzle types for the given functions + // so that the compiler does not have any ambiguity to choosing how to handle + // the function. + // + // The alternative is to use the operator()() when calling the function in order + // to explicitly convert the swizzled type to the unswizzled type. + // + + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, abs); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acos); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acosh); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, all); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, any); + + //GLM_SWIZZLE_FUNCTION_2_ARGS(value_type, dot); + //GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, cross); + //GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, step); + //GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(vec_type, mix); +} + +#define GLM_SWIZZLE2_2_MEMBERS(T, Q, E0,E1) \ + struct { detail::_swizzle<2, T, Q, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2, T, Q, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2, T, Q, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2, T, Q, 1,1,-1,-2> E1 ## E1; }; + +#define GLM_SWIZZLE2_3_MEMBERS(T, Q, E0,E1) \ + struct { detail::_swizzle<3,T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; + +#define GLM_SWIZZLE2_4_MEMBERS(T, Q, E0,E1) \ + struct { detail::_swizzle<4,T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; + +#define GLM_SWIZZLE3_2_MEMBERS(T, Q, E0,E1,E2) \ + struct { detail::_swizzle<2,T, Q, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 0,2,-1,-2> E0 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 1,1,-1,-2> E1 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 1,2,-1,-2> E1 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 2,0,-1,-2> E2 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 2,1,-1,-2> E2 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 2,2,-1,-2> E2 ## E2; }; + +#define GLM_SWIZZLE3_3_MEMBERS(T, Q ,E0,E1,E2) \ + struct { detail::_swizzle<3, T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,2,-1> E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,2,-1> E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,0,-1> E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,1,-1> E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,2,-1> E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,2,-1> E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,2,-1> E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,0,-1> E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,1,-1> E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,2,-1> E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,0,-1> E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,1,-1> E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,2,-1> E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,0,-1> E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,1,-1> E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,2,-1> E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,0,-1> E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,1,-1> E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,2,-1> E2 ## E2 ## E2; }; + +#define GLM_SWIZZLE3_4_MEMBERS(T, Q, E0,E1,E2) \ + struct { detail::_swizzle<4,T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; + +#define GLM_SWIZZLE4_2_MEMBERS(T, Q, E0,E1,E2,E3) \ + struct { detail::_swizzle<2,T, Q, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 0,2,-1,-2> E0 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 0,3,-1,-2> E0 ## E3; }; \ + struct { detail::_swizzle<2,T, Q, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 1,1,-1,-2> E1 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 1,2,-1,-2> E1 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 1,3,-1,-2> E1 ## E3; }; \ + struct { detail::_swizzle<2,T, Q, 2,0,-1,-2> E2 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 2,1,-1,-2> E2 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 2,2,-1,-2> E2 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 2,3,-1,-2> E2 ## E3; }; \ + struct { detail::_swizzle<2,T, Q, 3,0,-1,-2> E3 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 3,1,-1,-2> E3 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 3,2,-1,-2> E3 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 3,3,-1,-2> E3 ## E3; }; + +#define GLM_SWIZZLE4_3_MEMBERS(T, Q, E0,E1,E2,E3) \ + struct { detail::_swizzle<3, T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,2,-1> E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,3,-1> E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,2,-1> E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,3,-1> E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,0,-1> E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,1,-1> E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,2,-1> E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,3,-1> E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,0,-1> E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,1,-1> E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,2,-1> E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,3,-1> E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,2,-1> E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,3,-1> E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,2,-1> E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,3,-1> E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,0,-1> E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,1,-1> E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,2,-1> E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,3,-1> E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,0,-1> E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,1,-1> E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,2,-1> E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,3,-1> E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,0,-1> E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,1,-1> E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,2,-1> E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,3,-1> E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,0,-1> E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,1,-1> E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,2,-1> E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,3,-1> E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,0,-1> E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,1,-1> E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,2,-1> E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,3,-1> E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,0,-1> E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,1,-1> E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,2,-1> E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,3,-1> E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,0,-1> E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,1,-1> E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,2,-1> E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,3,-1> E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,0,-1> E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,1,-1> E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,2,-1> E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,3,-1> E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,0,-1> E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,1,-1> E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,2,-1> E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,3,-1> E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,0,-1> E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,1,-1> E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,2,-1> E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,3,-1> E3 ## E3 ## E3; }; + +#define GLM_SWIZZLE4_4_MEMBERS(T, Q, E0,E1,E2,E3) \ + struct { detail::_swizzle<4, T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,0,3> E0 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,3> E0 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,3> E0 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,0> E0 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,1> E0 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,2> E0 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,3> E0 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,3> E0 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,3> E0 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,3> E0 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,0> E0 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,1> E0 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,2> E0 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,3> E0 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,3> E0 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,3> E0 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,3> E0 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,0> E0 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,1> E0 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,2> E0 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,3> E0 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,0> E0 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,1> E0 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,2> E0 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,3> E0 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,0> E0 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,1> E0 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,2> E0 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,3> E0 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,0> E0 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,1> E0 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,2> E0 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,3> E0 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,0> E0 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,1> E0 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,2> E0 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,3> E0 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,3> E1 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,3> E1 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,3> E1 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,0> E1 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,1> E1 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,2> E1 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,3> E1 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,3> E1 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,3> E1 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,3> E1 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,0> E1 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,1> E1 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,2> E1 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,3> E1 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,3> E1 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,3> E1 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,3> E1 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,0> E1 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,1> E1 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,2> E1 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,3> E1 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,0> E1 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,1> E1 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,2> E1 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,3> E1 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,0> E1 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,1> E1 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,2> E1 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,3> E1 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,0> E1 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,1> E1 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,2> E1 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,3> E1 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,0> E1 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,1> E1 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,2> E1 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,3> E1 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,3> E2 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,3> E2 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,3> E2 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,0> E2 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,1> E2 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,2> E2 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,3> E2 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,3> E2 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,3> E2 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,3> E2 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,0> E2 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,1> E2 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,2> E2 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,3> E2 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,3> E2 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,3> E2 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,3> E2 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,0> E2 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,1> E2 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,2> E2 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,3> E2 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,0> E2 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,1> E2 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,2> E2 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,3> E2 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,0> E2 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,1> E2 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,2> E2 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,3> E2 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,0> E2 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,1> E2 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,2> E2 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,3> E2 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,0> E2 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,1> E2 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,2> E2 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,3> E2 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,0> E3 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,1> E3 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,2> E3 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,3> E3 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,0> E3 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,1> E3 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,2> E3 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,3> E3 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,0> E3 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,1> E3 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,2> E3 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,3> E3 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,0> E3 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,1> E3 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,2> E3 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,3> E3 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,0> E3 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,1> E3 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,2> E3 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,3> E3 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,0> E3 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,1> E3 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,2> E3 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,3> E3 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,0> E3 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,1> E3 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,2> E3 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,3> E3 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,0> E3 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,1> E3 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,2> E3 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,3> E3 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,0> E3 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,1> E3 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,2> E3 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,3> E3 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,0> E3 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,1> E3 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,2> E3 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,3> E3 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,0> E3 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,1> E3 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,2> E3 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,3> E3 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,0> E3 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,1> E3 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,2> E3 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,3> E3 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,0> E3 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,1> E3 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,2> E3 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,3> E3 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,0> E3 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,1> E3 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,2> E3 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,3> E3 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,0> E3 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,1> E3 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,2> E3 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,3> E3 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,0> E3 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,1> E3 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,2> E3 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,3> E3 ## E3 ## E3 ## E3; }; diff --git a/NothinFancy/dep/include/glm/detail/_swizzle_func.hpp b/NothinFancy/dep/include/glm/detail/_swizzle_func.hpp new file mode 100644 index 0000000..d93c6af --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/_swizzle_func.hpp @@ -0,0 +1,682 @@ +#pragma once + +#define GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, CONST, A, B) \ + vec<2, T, Q> A ## B() CONST \ + { \ + return vec<2, T, Q>(this->A, this->B); \ + } + +#define GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, CONST, A, B, C) \ + vec<3, T, Q> A ## B ## C() CONST \ + { \ + return vec<3, T, Q>(this->A, this->B, this->C); \ + } + +#define GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, CONST, A, B, C, D) \ + vec<4, T, Q> A ## B ## C ## D() CONST \ + { \ + return vec<4, T, Q>(this->A, this->B, this->C, this->D); \ + } + +#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(T, P, L, CONST, A, B) \ + template \ + vec vec::A ## B() CONST \ + { \ + return vec<2, T, Q>(this->A, this->B); \ + } + +#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(T, P, L, CONST, A, B, C) \ + template \ + vec<3, T, Q> vec::A ## B ## C() CONST \ + { \ + return vec<3, T, Q>(this->A, this->B, this->C); \ + } + +#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(T, P, L, CONST, A, B, C, D) \ + template \ + vec<4, T, Q> vec::A ## B ## C ## D() CONST \ + { \ + return vec<4, T, Q>(this->A, this->B, this->C, this->D); \ + } + +#define GLM_MUTABLE + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, 2, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, 2, GLM_MUTABLE, B, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(T, P) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, x, y) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, r, g) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, s, t) + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, B) + +#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, C, B, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(T, P, A, B, C) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(T, P) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, x, y, z) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, r, g, b) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, s, t, p) + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, C) + +#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, C, B) + +#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, B, C, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(T, P) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, x, y, z, w) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, r, g, b, a) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, s, t, p, q) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(T, P, A, B) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, x, y) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, r, g) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, s, t) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, C) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, C) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, C) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(T, P, A, B, C) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, x, y, z) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, r, g, b) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, s, t, p) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, D) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, D) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, D) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, x, y, z, w) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, r, g, b, a) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, s, t, p, q) + diff --git a/NothinFancy/dep/include/glm/detail/_vectorize.hpp b/NothinFancy/dep/include/glm/detail/_vectorize.hpp new file mode 100644 index 0000000..1fcaec3 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/_vectorize.hpp @@ -0,0 +1,162 @@ +#pragma once + +namespace glm{ +namespace detail +{ + template class vec, length_t L, typename R, typename T, qualifier Q> + struct functor1{}; + + template class vec, typename R, typename T, qualifier Q> + struct functor1 + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<1, R, Q> call(R (*Func) (T x), vec<1, T, Q> const& v) + { + return vec<1, R, Q>(Func(v.x)); + } + }; + + template class vec, typename R, typename T, qualifier Q> + struct functor1 + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<2, R, Q> call(R (*Func) (T x), vec<2, T, Q> const& v) + { + return vec<2, R, Q>(Func(v.x), Func(v.y)); + } + }; + + template class vec, typename R, typename T, qualifier Q> + struct functor1 + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<3, R, Q> call(R (*Func) (T x), vec<3, T, Q> const& v) + { + return vec<3, R, Q>(Func(v.x), Func(v.y), Func(v.z)); + } + }; + + template class vec, typename R, typename T, qualifier Q> + struct functor1 + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, R, Q> call(R (*Func) (T x), vec<4, T, Q> const& v) + { + return vec<4, R, Q>(Func(v.x), Func(v.y), Func(v.z), Func(v.w)); + } + }; + + template class vec, length_t L, typename T, qualifier Q> + struct functor2{}; + + template class vec, typename T, qualifier Q> + struct functor2 + { + GLM_FUNC_QUALIFIER static vec<1, T, Q> call(T (*Func) (T x, T y), vec<1, T, Q> const& a, vec<1, T, Q> const& b) + { + return vec<1, T, Q>(Func(a.x, b.x)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2 + { + GLM_FUNC_QUALIFIER static vec<2, T, Q> call(T (*Func) (T x, T y), vec<2, T, Q> const& a, vec<2, T, Q> const& b) + { + return vec<2, T, Q>(Func(a.x, b.x), Func(a.y, b.y)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2 + { + GLM_FUNC_QUALIFIER static vec<3, T, Q> call(T (*Func) (T x, T y), vec<3, T, Q> const& a, vec<3, T, Q> const& b) + { + return vec<3, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2 + { + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(T (*Func) (T x, T y), vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w)); + } + }; + + template class vec, length_t L, typename T, qualifier Q> + struct functor2_vec_sca{}; + + template class vec, typename T, qualifier Q> + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static vec<1, T, Q> call(T (*Func) (T x, T y), vec<1, T, Q> const& a, T b) + { + return vec<1, T, Q>(Func(a.x, b)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static vec<2, T, Q> call(T (*Func) (T x, T y), vec<2, T, Q> const& a, T b) + { + return vec<2, T, Q>(Func(a.x, b), Func(a.y, b)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static vec<3, T, Q> call(T (*Func) (T x, T y), vec<3, T, Q> const& a, T b) + { + return vec<3, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(T (*Func) (T x, T y), vec<4, T, Q> const& a, T b) + { + return vec<4, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b)); + } + }; + + template + struct functor2_vec_int {}; + + template + struct functor2_vec_int<1, T, Q> + { + GLM_FUNC_QUALIFIER static vec<1, int, Q> call(int (*Func) (T x, int y), vec<1, T, Q> const& a, vec<1, int, Q> const& b) + { + return vec<1, int, Q>(Func(a.x, b.x)); + } + }; + + template + struct functor2_vec_int<2, T, Q> + { + GLM_FUNC_QUALIFIER static vec<2, int, Q> call(int (*Func) (T x, int y), vec<2, T, Q> const& a, vec<2, int, Q> const& b) + { + return vec<2, int, Q>(Func(a.x, b.x), Func(a.y, b.y)); + } + }; + + template + struct functor2_vec_int<3, T, Q> + { + GLM_FUNC_QUALIFIER static vec<3, int, Q> call(int (*Func) (T x, int y), vec<3, T, Q> const& a, vec<3, int, Q> const& b) + { + return vec<3, int, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z)); + } + }; + + template + struct functor2_vec_int<4, T, Q> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(int (*Func) (T x, int y), vec<4, T, Q> const& a, vec<4, int, Q> const& b) + { + return vec<4, int, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w)); + } + }; +}//namespace detail +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/compute_common.hpp b/NothinFancy/dep/include/glm/detail/compute_common.hpp new file mode 100644 index 0000000..cc24b9e --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/compute_common.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "setup.hpp" +#include + +namespace glm{ +namespace detail +{ + template + struct compute_abs + {}; + + template + struct compute_abs + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genFIType call(genFIType x) + { + GLM_STATIC_ASSERT( + std::numeric_limits::is_iec559 || std::numeric_limits::is_signed, + "'abs' only accept floating-point and integer scalar or vector inputs"); + + return x >= genFIType(0) ? x : -x; + // TODO, perf comp with: *(((int *) &x) + 1) &= 0x7fffffff; + } + }; + +#if GLM_COMPILER & GLM_COMPILER_CUDA + template<> + struct compute_abs + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static float call(float x) + { + return fabsf(x); + } + }; +#endif + + template + struct compute_abs + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genFIType call(genFIType x) + { + GLM_STATIC_ASSERT( + (!std::numeric_limits::is_signed && std::numeric_limits::is_integer), + "'abs' only accept floating-point and integer scalar or vector inputs"); + return x; + } + }; +}//namespace detail +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/compute_vector_relational.hpp b/NothinFancy/dep/include/glm/detail/compute_vector_relational.hpp new file mode 100644 index 0000000..167b634 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/compute_vector_relational.hpp @@ -0,0 +1,30 @@ +#pragma once + +//#include "compute_common.hpp" +#include "setup.hpp" +#include + +namespace glm{ +namespace detail +{ + template + struct compute_equal + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(T a, T b) + { + return a == b; + } + }; +/* + template + struct compute_equal + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(T a, T b) + { + return detail::compute_abs::is_signed>::call(b - a) <= static_cast(0); + //return std::memcmp(&a, &b, sizeof(T)) == 0; + } + }; +*/ +}//namespace detail +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/func_common.inl b/NothinFancy/dep/include/glm/detail/func_common.inl new file mode 100644 index 0000000..4b5f144 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_common.inl @@ -0,0 +1,792 @@ +/// @ref core +/// @file glm/detail/func_common.inl + +#include "../vector_relational.hpp" +#include "compute_common.hpp" +#include "type_vec1.hpp" +#include "type_vec2.hpp" +#include "type_vec3.hpp" +#include "type_vec4.hpp" +#include "_vectorize.hpp" +#include + +namespace glm +{ + // min + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType min(genType x, genType y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'min' only accept floating-point or integer inputs"); + return (y < x) ? y : x; + } + + // max + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType max(genType x, genType y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'max' only accept floating-point or integer inputs"); + + return (x < y) ? y : x; + } + + // abs + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR int abs(int x) + { + int const y = x >> (sizeof(int) * 8 - 1); + return (x ^ y) - y; + } + + // round +# if GLM_HAS_CXX11_STL + using ::std::round; +# else + template + GLM_FUNC_QUALIFIER genType round(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'round' only accept floating-point inputs"); + + return x < static_cast(0) ? static_cast(int(x - static_cast(0.5))) : static_cast(int(x + static_cast(0.5))); + } +# endif + + // trunc +# if GLM_HAS_CXX11_STL + using ::std::trunc; +# else + template + GLM_FUNC_QUALIFIER genType trunc(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'trunc' only accept floating-point inputs"); + + return x < static_cast(0) ? -std::floor(-x) : std::floor(x); + } +# endif + +}//namespace glm + +namespace glm{ +namespace detail +{ + template + struct compute_abs_vector + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec call(vec const& x) + { + return detail::functor1::call(abs, x); + } + }; + + template + struct compute_mix_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y, vec const& a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); + + return vec(vec(x) * (static_cast(1) - a) + vec(y) * a); + } + }; + + template + struct compute_mix_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y, vec const& a) + { + vec Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = a[i] ? y[i] : x[i]; + return Result; + } + }; + + template + struct compute_mix_scalar + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y, U const& a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); + + return vec(vec(x) * (static_cast(1) - a) + vec(y) * a); + } + }; + + template + struct compute_mix_scalar + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y, bool const& a) + { + return a ? y : x; + } + }; + + template + struct compute_mix + { + GLM_FUNC_QUALIFIER static T call(T const& x, T const& y, U const& a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); + + return static_cast(static_cast(x) * (static_cast(1) - a) + static_cast(y) * a); + } + }; + + template + struct compute_mix + { + GLM_FUNC_QUALIFIER static T call(T const& x, T const& y, bool const& a) + { + return a ? y : x; + } + }; + + template + struct compute_sign + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return vec(glm::lessThan(vec(0), x)) - vec(glm::lessThan(x, vec(0))); + } + }; + +# if GLM_ARCH == GLM_ARCH_X86 + template + struct compute_sign + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + T const Shift(static_cast(sizeof(T) * 8 - 1)); + vec const y(vec::type, Q>(-x) >> typename detail::make_unsigned::type(Shift)); + + return (x >> Shift) | y; + } + }; +# endif + + template + struct compute_floor + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(std::floor, x); + } + }; + + template + struct compute_ceil + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(std::ceil, x); + } + }; + + template + struct compute_fract + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return x - floor(x); + } + }; + + template + struct compute_trunc + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(trunc, x); + } + }; + + template + struct compute_round + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(round, x); + } + }; + + template + struct compute_mod + { + GLM_FUNC_QUALIFIER static vec call(vec const& a, vec const& b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'mod' only accept floating-point inputs. Include for integer inputs."); + return a - b * floor(a / b); + } + }; + + template + struct compute_min_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y) + { + return detail::functor2::call(min, x, y); + } + }; + + template + struct compute_max_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y) + { + return detail::functor2::call(max, x, y); + } + }; + + template + struct compute_clamp_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& minVal, vec const& maxVal) + { + return min(max(x, minVal), maxVal); + } + }; + + template + struct compute_step_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& edge, vec const& x) + { + return mix(vec(1), vec(0), glm::lessThan(x, edge)); + } + }; + + template + struct compute_smoothstep_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& edge0, vec const& edge1, vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'smoothstep' only accept floating-point inputs"); + vec const tmp(clamp((x - edge0) / (edge1 - edge0), static_cast(0), static_cast(1))); + return tmp * tmp * (static_cast(3) - static_cast(2) * tmp); + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genFIType abs(genFIType x) + { + return detail::compute_abs::is_signed>::call(x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec abs(vec const& x) + { + return detail::compute_abs_vector::value>::call(x); + } + + // sign + // fast and works for any type + template + GLM_FUNC_QUALIFIER genFIType sign(genFIType x) + { + GLM_STATIC_ASSERT( + std::numeric_limits::is_iec559 || (std::numeric_limits::is_signed && std::numeric_limits::is_integer), + "'sign' only accept signed inputs"); + + return detail::compute_sign<1, genFIType, defaultp, + std::numeric_limits::is_iec559, detail::is_aligned::value>::call(vec<1, genFIType>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec sign(vec const& x) + { + GLM_STATIC_ASSERT( + std::numeric_limits::is_iec559 || (std::numeric_limits::is_signed && std::numeric_limits::is_integer), + "'sign' only accept signed inputs"); + + return detail::compute_sign::is_iec559, detail::is_aligned::value>::call(x); + } + + // floor + using ::std::floor; + template + GLM_FUNC_QUALIFIER vec floor(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'floor' only accept floating-point inputs."); + return detail::compute_floor::value>::call(x); + } + + template + GLM_FUNC_QUALIFIER vec trunc(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'trunc' only accept floating-point inputs"); + return detail::compute_trunc::value>::call(x); + } + + template + GLM_FUNC_QUALIFIER vec round(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'round' only accept floating-point inputs"); + return detail::compute_round::value>::call(x); + } + +/* + // roundEven + template + GLM_FUNC_QUALIFIER genType roundEven(genType const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'roundEven' only accept floating-point inputs"); + + return genType(int(x + genType(int(x) % 2))); + } +*/ + + // roundEven + template + GLM_FUNC_QUALIFIER genType roundEven(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'roundEven' only accept floating-point inputs"); + + int Integer = static_cast(x); + genType IntegerPart = static_cast(Integer); + genType FractionalPart = fract(x); + + if(FractionalPart > static_cast(0.5) || FractionalPart < static_cast(0.5)) + { + return round(x); + } + else if((Integer % 2) == 0) + { + return IntegerPart; + } + else if(x <= static_cast(0)) // Work around... + { + return IntegerPart - static_cast(1); + } + else + { + return IntegerPart + static_cast(1); + } + //else // Bug on MinGW 4.5.2 + //{ + // return mix(IntegerPart + genType(-1), IntegerPart + genType(1), x <= genType(0)); + //} + } + + template + GLM_FUNC_QUALIFIER vec roundEven(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'roundEven' only accept floating-point inputs"); + return detail::functor1::call(roundEven, x); + } + + // ceil + using ::std::ceil; + template + GLM_FUNC_QUALIFIER vec ceil(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'ceil' only accept floating-point inputs"); + return detail::compute_ceil::value>::call(x); + } + + // fract + template + GLM_FUNC_QUALIFIER genType fract(genType x) + { + return fract(vec<1, genType>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec fract(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fract' only accept floating-point inputs"); + return detail::compute_fract::value>::call(x); + } + + // mod + template + GLM_FUNC_QUALIFIER genType mod(genType x, genType y) + { +# if GLM_COMPILER & GLM_COMPILER_CUDA + // Another Cuda compiler bug https://github.com/g-truc/glm/issues/530 + vec<1, genType, defaultp> Result(mod(vec<1, genType, defaultp>(x), y)); + return Result.x; +# else + return mod(vec<1, genType, defaultp>(x), y).x; +# endif + } + + template + GLM_FUNC_QUALIFIER vec mod(vec const& x, T y) + { + return detail::compute_mod::value>::call(x, vec(y)); + } + + template + GLM_FUNC_QUALIFIER vec mod(vec const& x, vec const& y) + { + return detail::compute_mod::value>::call(x, y); + } + + // modf + template + GLM_FUNC_QUALIFIER genType modf(genType x, genType & i) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'modf' only accept floating-point inputs"); + return std::modf(x, &i); + } + + template + GLM_FUNC_QUALIFIER vec<1, T, Q> modf(vec<1, T, Q> const& x, vec<1, T, Q> & i) + { + return vec<1, T, Q>( + modf(x.x, i.x)); + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> modf(vec<2, T, Q> const& x, vec<2, T, Q> & i) + { + return vec<2, T, Q>( + modf(x.x, i.x), + modf(x.y, i.y)); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> modf(vec<3, T, Q> const& x, vec<3, T, Q> & i) + { + return vec<3, T, Q>( + modf(x.x, i.x), + modf(x.y, i.y), + modf(x.z, i.z)); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> modf(vec<4, T, Q> const& x, vec<4, T, Q> & i) + { + return vec<4, T, Q>( + modf(x.x, i.x), + modf(x.y, i.y), + modf(x.z, i.z), + modf(x.w, i.w)); + } + + //// Only valid if (INT_MIN <= x-y <= INT_MAX) + //// min(x,y) + //r = y + ((x - y) & ((x - y) >> (sizeof(int) * + //CHAR_BIT - 1))); + //// max(x,y) + //r = x - ((x - y) & ((x - y) >> (sizeof(int) * + //CHAR_BIT - 1))); + + // min + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec min(vec const& a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'min' only accept floating-point or integer inputs"); + return detail::compute_min_vector::value>::call(a, vec(b)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec min(vec const& a, vec const& b) + { + return detail::compute_min_vector::value>::call(a, b); + } + + // max + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec max(vec const& a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'max' only accept floating-point or integer inputs"); + return detail::compute_max_vector::value>::call(a, vec(b)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec max(vec const& a, vec const& b) + { + return detail::compute_max_vector::value>::call(a, b); + } + + // clamp + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType clamp(genType x, genType minVal, genType maxVal) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'clamp' only accept floating-point or integer inputs"); + return min(max(x, minVal), maxVal); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec clamp(vec const& x, T minVal, T maxVal) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'clamp' only accept floating-point or integer inputs"); + return detail::compute_clamp_vector::value>::call(x, vec(minVal), vec(maxVal)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec clamp(vec const& x, vec const& minVal, vec const& maxVal) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'clamp' only accept floating-point or integer inputs"); + return detail::compute_clamp_vector::value>::call(x, minVal, maxVal); + } + + template + GLM_FUNC_QUALIFIER genTypeT mix(genTypeT x, genTypeT y, genTypeU a) + { + return detail::compute_mix::call(x, y, a); + } + + template + GLM_FUNC_QUALIFIER vec mix(vec const& x, vec const& y, U a) + { + return detail::compute_mix_scalar::value>::call(x, y, a); + } + + template + GLM_FUNC_QUALIFIER vec mix(vec const& x, vec const& y, vec const& a) + { + return detail::compute_mix_vector::value>::call(x, y, a); + } + + // step + template + GLM_FUNC_QUALIFIER genType step(genType edge, genType x) + { + return mix(static_cast(1), static_cast(0), x < edge); + } + + template + GLM_FUNC_QUALIFIER vec step(T edge, vec const& x) + { + return detail::compute_step_vector::value>::call(vec(edge), x); + } + + template + GLM_FUNC_QUALIFIER vec step(vec const& edge, vec const& x) + { + return detail::compute_step_vector::value>::call(edge, x); + } + + // smoothstep + template + GLM_FUNC_QUALIFIER genType smoothstep(genType edge0, genType edge1, genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'smoothstep' only accept floating-point inputs"); + + genType const tmp(clamp((x - edge0) / (edge1 - edge0), genType(0), genType(1))); + return tmp * tmp * (genType(3) - genType(2) * tmp); + } + + template + GLM_FUNC_QUALIFIER vec smoothstep(T edge0, T edge1, vec const& x) + { + return detail::compute_smoothstep_vector::value>::call(vec(edge0), vec(edge1), x); + } + + template + GLM_FUNC_QUALIFIER vec smoothstep(vec const& edge0, vec const& edge1, vec const& x) + { + return detail::compute_smoothstep_vector::value>::call(edge0, edge1, x); + } + +# if GLM_HAS_CXX11_STL + using std::isnan; +# else + template + GLM_FUNC_QUALIFIER bool isnan(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isnan' only accept floating-point inputs"); + +# if GLM_HAS_CXX11_STL + return std::isnan(x); +# elif GLM_COMPILER & GLM_COMPILER_VC + return _isnan(x) != 0; +# elif GLM_COMPILER & GLM_COMPILER_INTEL +# if GLM_PLATFORM & GLM_PLATFORM_WINDOWS + return _isnan(x) != 0; +# else + return ::isnan(x) != 0; +# endif +# elif (GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)) && (GLM_PLATFORM & GLM_PLATFORM_ANDROID) && __cplusplus < 201103L + return _isnan(x) != 0; +# elif GLM_COMPILER & GLM_COMPILER_CUDA + return ::isnan(x) != 0; +# else + return std::isnan(x); +# endif + } +# endif + + template + GLM_FUNC_QUALIFIER vec isnan(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isnan' only accept floating-point inputs"); + + vec Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = glm::isnan(v[l]); + return Result; + } + +# if GLM_HAS_CXX11_STL + using std::isinf; +# else + template + GLM_FUNC_QUALIFIER bool isinf(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isinf' only accept floating-point inputs"); + +# if GLM_HAS_CXX11_STL + return std::isinf(x); +# elif GLM_COMPILER & (GLM_COMPILER_INTEL | GLM_COMPILER_VC) +# if(GLM_PLATFORM & GLM_PLATFORM_WINDOWS) + return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF; +# else + return ::isinf(x); +# endif +# elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG) +# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID && __cplusplus < 201103L) + return _isinf(x) != 0; +# else + return std::isinf(x); +# endif +# elif GLM_COMPILER & GLM_COMPILER_CUDA + // http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__MATH__DOUBLE_g13431dd2b40b51f9139cbb7f50c18fab.html#g13431dd2b40b51f9139cbb7f50c18fab + return ::isinf(double(x)) != 0; +# else + return std::isinf(x); +# endif + } +# endif + + template + GLM_FUNC_QUALIFIER vec isinf(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isinf' only accept floating-point inputs"); + + vec Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = glm::isinf(v[l]); + return Result; + } + + GLM_FUNC_QUALIFIER int floatBitsToInt(float const& v) + { + union + { + float in; + int out; + } u; + + u.in = v; + + return u.out; + } + + template + GLM_FUNC_QUALIFIER vec floatBitsToInt(vec const& v) + { + return reinterpret_cast&>(const_cast&>(v)); + } + + GLM_FUNC_QUALIFIER uint floatBitsToUint(float const& v) + { + union + { + float in; + uint out; + } u; + + u.in = v; + + return u.out; + } + + template + GLM_FUNC_QUALIFIER vec floatBitsToUint(vec const& v) + { + return reinterpret_cast&>(const_cast&>(v)); + } + + GLM_FUNC_QUALIFIER float intBitsToFloat(int const& v) + { + union + { + int in; + float out; + } u; + + u.in = v; + + return u.out; + } + + template + GLM_FUNC_QUALIFIER vec intBitsToFloat(vec const& v) + { + return reinterpret_cast&>(const_cast&>(v)); + } + + GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const& v) + { + union + { + uint in; + float out; + } u; + + u.in = v; + + return u.out; + } + + template + GLM_FUNC_QUALIFIER vec uintBitsToFloat(vec const& v) + { + return reinterpret_cast&>(const_cast&>(v)); + } + +# if GLM_HAS_CXX11_STL + using std::fma; +# else + template + GLM_FUNC_QUALIFIER genType fma(genType const& a, genType const& b, genType const& c) + { + return a * b + c; + } +# endif + + template + GLM_FUNC_QUALIFIER genType frexp(genType x, int& exp) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'frexp' only accept floating-point inputs"); + + return std::frexp(x, &exp); + } + + template + GLM_FUNC_QUALIFIER vec frexp(vec const& v, vec& exp) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'frexp' only accept floating-point inputs"); + + vec Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = std::frexp(v[l], &exp[l]); + return Result; + } + + template + GLM_FUNC_QUALIFIER genType ldexp(genType const& x, int const& exp) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'ldexp' only accept floating-point inputs"); + + return std::ldexp(x, exp); + } + + template + GLM_FUNC_QUALIFIER vec ldexp(vec const& v, vec const& exp) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'ldexp' only accept floating-point inputs"); + + vec Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = std::ldexp(v[l], exp[l]); + return Result; + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_common_simd.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/func_common_simd.inl b/NothinFancy/dep/include/glm/detail/func_common_simd.inl new file mode 100644 index 0000000..ce0032d --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_common_simd.inl @@ -0,0 +1,231 @@ +/// @ref core +/// @file glm/detail/func_common_simd.inl + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +#include "../simd/common.h" + +#include + +namespace glm{ +namespace detail +{ + template + struct compute_abs_vector<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> result; + result.data = glm_vec4_abs(v.data); + return result; + } + }; + + template + struct compute_abs_vector<4, int, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v) + { + vec<4, int, Q> result; + result.data = glm_ivec4_abs(v.data); + return result; + } + }; + + template + struct compute_floor<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> result; + result.data = glm_vec4_floor(v.data); + return result; + } + }; + + template + struct compute_ceil<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> result; + result.data = glm_vec4_ceil(v.data); + return result; + } + }; + + template + struct compute_fract<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> result; + result.data = glm_vec4_fract(v.data); + return result; + } + }; + + template + struct compute_round<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> result; + result.data = glm_vec4_round(v.data); + return result; + } + }; + + template + struct compute_mod<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& y) + { + vec<4, float, Q> result; + result.data = glm_vec4_mod(x.data, y.data); + return result; + } + }; + + template + struct compute_min_vector<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + vec<4, float, Q> result; + result.data = _mm_min_ps(v1.data, v2.data); + return result; + } + }; + + template + struct compute_min_vector<4, int, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + vec<4, int, Q> result; + result.data = _mm_min_epi32(v1.data, v2.data); + return result; + } + }; + + template + struct compute_min_vector<4, uint, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& v1, vec<4, uint, Q> const& v2) + { + vec<4, uint, Q> result; + result.data = _mm_min_epu32(v1.data, v2.data); + return result; + } + }; + + template + struct compute_max_vector<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + vec<4, float, Q> result; + result.data = _mm_max_ps(v1.data, v2.data); + return result; + } + }; + + template + struct compute_max_vector<4, int, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + vec<4, int, Q> result; + result.data = _mm_max_epi32(v1.data, v2.data); + return result; + } + }; + + template + struct compute_max_vector<4, uint, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& v1, vec<4, uint, Q> const& v2) + { + vec<4, uint, Q> result; + result.data = _mm_max_epu32(v1.data, v2.data); + return result; + } + }; + + template + struct compute_clamp_vector<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& minVal, vec<4, float, Q> const& maxVal) + { + vec<4, float, Q> result; + result.data = _mm_min_ps(_mm_max_ps(x.data, minVal.data), maxVal.data); + return result; + } + }; + + template + struct compute_clamp_vector<4, int, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& x, vec<4, int, Q> const& minVal, vec<4, int, Q> const& maxVal) + { + vec<4, int, Q> result; + result.data = _mm_min_epi32(_mm_max_epi32(x.data, minVal.data), maxVal.data); + return result; + } + }; + + template + struct compute_clamp_vector<4, uint, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& x, vec<4, uint, Q> const& minVal, vec<4, uint, Q> const& maxVal) + { + vec<4, uint, Q> result; + result.data = _mm_min_epu32(_mm_max_epu32(x.data, minVal.data), maxVal.data); + return result; + } + }; + + template + struct compute_mix_vector<4, float, bool, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& y, vec<4, bool, Q> const& a) + { + __m128i const Load = _mm_set_epi32(-static_cast(a.w), -static_cast(a.z), -static_cast(a.y), -static_cast(a.x)); + __m128 const Mask = _mm_castsi128_ps(Load); + + vec<4, float, Q> Result; +# if 0 && GLM_ARCH & GLM_ARCH_AVX + Result.data = _mm_blendv_ps(x.data, y.data, Mask); +# else + Result.data = _mm_or_ps(_mm_and_ps(Mask, y.data), _mm_andnot_ps(Mask, x.data)); +# endif + return Result; + } + }; +/* FIXME + template + struct compute_step_vector + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& edge, vec<4, float, Q> const& x) + { + vec<4, float, Q> Result; + result.data = glm_vec4_step(edge.data, x.data); + return result; + } + }; +*/ + template + struct compute_smoothstep_vector<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& edge0, vec<4, float, Q> const& edge1, vec<4, float, Q> const& x) + { + vec<4, float, Q> Result; + Result.data = glm_vec4_smoothstep(edge0.data, edge1.data, x.data); + return Result; + } + }; +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/detail/func_exponential.inl b/NothinFancy/dep/include/glm/detail/func_exponential.inl new file mode 100644 index 0000000..2040d41 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_exponential.inl @@ -0,0 +1,152 @@ +/// @ref core +/// @file glm/detail/func_exponential.inl + +#include "../vector_relational.hpp" +#include "_vectorize.hpp" +#include +#include +#include + +namespace glm{ +namespace detail +{ +# if GLM_HAS_CXX11_STL + using std::log2; +# else + template + genType log2(genType Value) + { + return std::log(Value) * static_cast(1.4426950408889634073599246810019); + } +# endif + + template + struct compute_log2 + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'log2' only accept floating-point inputs. Include for integer inputs."); + + return detail::functor1::call(log2, v); + } + }; + + template + struct compute_sqrt + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(std::sqrt, x); + } + }; + + template + struct compute_inversesqrt + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return static_cast(1) / sqrt(x); + } + }; + + template + struct compute_inversesqrt + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + vec tmp(x); + vec xhalf(tmp * 0.5f); + vec* p = reinterpret_cast*>(const_cast*>(&x)); + vec i = vec(0x5f375a86) - (*p >> vec(1)); + vec* ptmp = reinterpret_cast*>(&i); + tmp = *ptmp; + tmp = tmp * (1.5f - xhalf * tmp * tmp); + return tmp; + } + }; +}//namespace detail + + // pow + using std::pow; + template + GLM_FUNC_QUALIFIER vec pow(vec const& base, vec const& exponent) + { + return detail::functor2::call(pow, base, exponent); + } + + // exp + using std::exp; + template + GLM_FUNC_QUALIFIER vec exp(vec const& x) + { + return detail::functor1::call(exp, x); + } + + // log + using std::log; + template + GLM_FUNC_QUALIFIER vec log(vec const& x) + { + return detail::functor1::call(log, x); + } + +# if GLM_HAS_CXX11_STL + using std::exp2; +# else + //exp2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType exp2(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'exp2' only accept floating-point inputs"); + + return std::exp(static_cast(0.69314718055994530941723212145818) * x); + } +# endif + + template + GLM_FUNC_QUALIFIER vec exp2(vec const& x) + { + return detail::functor1::call(exp2, x); + } + + // log2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType log2(genType x) + { + return log2(vec<1, genType>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec log2(vec const& x) + { + return detail::compute_log2::is_iec559, detail::is_aligned::value>::call(x); + } + + // sqrt + using std::sqrt; + template + GLM_FUNC_QUALIFIER vec sqrt(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'sqrt' only accept floating-point inputs"); + return detail::compute_sqrt::value>::call(x); + } + + // inversesqrt + template + GLM_FUNC_QUALIFIER genType inversesqrt(genType x) + { + return static_cast(1) / sqrt(x); + } + + template + GLM_FUNC_QUALIFIER vec inversesqrt(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'inversesqrt' only accept floating-point inputs"); + return detail::compute_inversesqrt::value>::call(x); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_exponential_simd.inl" +#endif + diff --git a/NothinFancy/dep/include/glm/detail/func_exponential_simd.inl b/NothinFancy/dep/include/glm/detail/func_exponential_simd.inl new file mode 100644 index 0000000..fb78951 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_exponential_simd.inl @@ -0,0 +1,37 @@ +/// @ref core +/// @file glm/detail/func_exponential_simd.inl + +#include "../simd/exponential.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ + template + struct compute_sqrt<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> Result; + Result.data = _mm_sqrt_ps(v.data); + return Result; + } + }; + +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE + template<> + struct compute_sqrt<4, float, aligned_lowp, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, aligned_lowp> call(vec<4, float, aligned_lowp> const& v) + { + vec<4, float, aligned_lowp> Result; + Result.data = glm_vec4_sqrt_lowp(v.data); + return Result; + } + }; +# endif +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/detail/func_geometric.inl b/NothinFancy/dep/include/glm/detail/func_geometric.inl new file mode 100644 index 0000000..9cde28f --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_geometric.inl @@ -0,0 +1,243 @@ +#include "../exponential.hpp" +#include "../common.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_length + { + GLM_FUNC_QUALIFIER static T call(vec const& v) + { + return sqrt(dot(v, v)); + } + }; + + template + struct compute_distance + { + GLM_FUNC_QUALIFIER static T call(vec const& p0, vec const& p1) + { + return length(p1 - p0); + } + }; + + template + struct compute_dot{}; + + template + struct compute_dot, T, Aligned> + { + GLM_FUNC_QUALIFIER static T call(vec<1, T, Q> const& a, vec<1, T, Q> const& b) + { + return a.x * b.x; + } + }; + + template + struct compute_dot, T, Aligned> + { + GLM_FUNC_QUALIFIER static T call(vec<2, T, Q> const& a, vec<2, T, Q> const& b) + { + vec<2, T, Q> tmp(a * b); + return tmp.x + tmp.y; + } + }; + + template + struct compute_dot, T, Aligned> + { + GLM_FUNC_QUALIFIER static T call(vec<3, T, Q> const& a, vec<3, T, Q> const& b) + { + vec<3, T, Q> tmp(a * b); + return tmp.x + tmp.y + tmp.z; + } + }; + + template + struct compute_dot, T, Aligned> + { + GLM_FUNC_QUALIFIER static T call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> tmp(a * b); + return (tmp.x + tmp.y) + (tmp.z + tmp.w); + } + }; + + template + struct compute_cross + { + GLM_FUNC_QUALIFIER static vec<3, T, Q> call(vec<3, T, Q> const& x, vec<3, T, Q> const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'cross' accepts only floating-point inputs"); + + return vec<3, T, Q>( + x.y * y.z - y.y * x.z, + x.z * y.x - y.z * x.x, + x.x * y.y - y.x * x.y); + } + }; + + template + struct compute_normalize + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'normalize' accepts only floating-point inputs"); + + return v * inversesqrt(dot(v, v)); + } + }; + + template + struct compute_faceforward + { + GLM_FUNC_QUALIFIER static vec call(vec const& N, vec const& I, vec const& Nref) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'normalize' accepts only floating-point inputs"); + + return dot(Nref, I) < static_cast(0) ? N : -N; + } + }; + + template + struct compute_reflect + { + GLM_FUNC_QUALIFIER static vec call(vec const& I, vec const& N) + { + return I - N * dot(N, I) * static_cast(2); + } + }; + + template + struct compute_refract + { + GLM_FUNC_QUALIFIER static vec call(vec const& I, vec const& N, T eta) + { + T const dotValue(dot(N, I)); + T const k(static_cast(1) - eta * eta * (static_cast(1) - dotValue * dotValue)); + vec const Result = + (k >= static_cast(0)) ? (eta * I - (eta * dotValue + std::sqrt(k)) * N) : vec(0); + return Result; + } + }; +}//namespace detail + + // length + template + GLM_FUNC_QUALIFIER genType length(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'length' accepts only floating-point inputs"); + + return abs(x); + } + + template + GLM_FUNC_QUALIFIER T length(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'length' accepts only floating-point inputs"); + + return detail::compute_length::value>::call(v); + } + + // distance + template + GLM_FUNC_QUALIFIER genType distance(genType const& p0, genType const& p1) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'distance' accepts only floating-point inputs"); + + return length(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER T distance(vec const& p0, vec const& p1) + { + return detail::compute_distance::value>::call(p0, p1); + } + + // dot + template + GLM_FUNC_QUALIFIER T dot(T x, T y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'dot' accepts only floating-point inputs"); + return x * y; + } + + template + GLM_FUNC_QUALIFIER T dot(vec const& x, vec const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'dot' accepts only floating-point inputs"); + return detail::compute_dot, T, detail::is_aligned::value>::call(x, y); + } + + // cross + template + GLM_FUNC_QUALIFIER vec<3, T, Q> cross(vec<3, T, Q> const& x, vec<3, T, Q> const& y) + { + return detail::compute_cross::value>::call(x, y); + } +/* + // normalize + template + GLM_FUNC_QUALIFIER genType normalize(genType const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'normalize' accepts only floating-point inputs"); + + return x < genType(0) ? genType(-1) : genType(1); + } +*/ + template + GLM_FUNC_QUALIFIER vec normalize(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'normalize' accepts only floating-point inputs"); + + return detail::compute_normalize::value>::call(x); + } + + // faceforward + template + GLM_FUNC_QUALIFIER genType faceforward(genType const& N, genType const& I, genType const& Nref) + { + return dot(Nref, I) < static_cast(0) ? N : -N; + } + + template + GLM_FUNC_QUALIFIER vec faceforward(vec const& N, vec const& I, vec const& Nref) + { + return detail::compute_faceforward::value>::call(N, I, Nref); + } + + // reflect + template + GLM_FUNC_QUALIFIER genType reflect(genType const& I, genType const& N) + { + return I - N * dot(N, I) * genType(2); + } + + template + GLM_FUNC_QUALIFIER vec reflect(vec const& I, vec const& N) + { + return detail::compute_reflect::value>::call(I, N); + } + + // refract + template + GLM_FUNC_QUALIFIER genType refract(genType const& I, genType const& N, genType eta) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'refract' accepts only floating-point inputs"); + genType const dotValue(dot(N, I)); + genType const k(static_cast(1) - eta * eta * (static_cast(1) - dotValue * dotValue)); + return (eta * I - (eta * dotValue + sqrt(k)) * N) * static_cast(k >= static_cast(0)); + } + + template + GLM_FUNC_QUALIFIER vec refract(vec const& I, vec const& N, T eta) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'refract' accepts only floating-point inputs"); + return detail::compute_refract::value>::call(I, N, eta); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_geometric_simd.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/func_geometric_simd.inl b/NothinFancy/dep/include/glm/detail/func_geometric_simd.inl new file mode 100644 index 0000000..2076dae --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_geometric_simd.inl @@ -0,0 +1,163 @@ +/// @ref core +/// @file glm/detail/func_geometric_simd.inl + +#include "../simd/geometric.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ + template + struct compute_length<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& v) + { + return _mm_cvtss_f32(glm_vec4_length(v.data)); + } + }; + + template + struct compute_distance<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& p0, vec<4, float, Q> const& p1) + { + return _mm_cvtss_f32(glm_vec4_distance(p0.data, p1.data)); + } + }; + + template + struct compute_dot, float, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& x, vec<4, float, Q> const& y) + { + return _mm_cvtss_f32(glm_vec1_dot(x.data, y.data)); + } + }; + + template + struct compute_cross + { + GLM_FUNC_QUALIFIER static vec<3, float, Q> call(vec<3, float, Q> const& a, vec<3, float, Q> const& b) + { + __m128 const set0 = _mm_set_ps(0.0f, a.z, a.y, a.x); + __m128 const set1 = _mm_set_ps(0.0f, b.z, b.y, b.x); + __m128 const xpd0 = glm_vec4_cross(set0, set1); + + vec<4, float, Q> Result; + Result.data = xpd0; + return vec<3, float, Q>(Result); + } + }; + + template + struct compute_normalize<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> Result; + Result.data = glm_vec4_normalize(v.data); + return Result; + } + }; + + template + struct compute_faceforward<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& N, vec<4, float, Q> const& I, vec<4, float, Q> const& Nref) + { + vec<4, float, Q> Result; + Result.data = glm_vec4_faceforward(N.data, I.data, Nref.data); + return Result; + } + }; + + template + struct compute_reflect<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& I, vec<4, float, Q> const& N) + { + vec<4, float, Q> Result; + Result.data = glm_vec4_reflect(I.data, N.data); + return Result; + } + }; + + template + struct compute_refract<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& I, vec<4, float, Q> const& N, float eta) + { + vec<4, float, Q> Result; + Result.data = glm_vec4_refract(I.data, N.data, _mm_set1_ps(eta)); + return Result; + } + }; +}//namespace detail +}//namespace glm + +#elif GLM_ARCH & GLM_ARCH_NEON_BIT +namespace glm{ +namespace detail +{ + template + struct compute_length<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& v) + { + return sqrt(compute_dot, float, true>::call(v, v)); + } + }; + + template + struct compute_distance<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& p0, vec<4, float, Q> const& p1) + { + return compute_length<4, float, Q, true>::call(p1 - p0); + } + }; + + + template + struct compute_dot, float, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& x, vec<4, float, Q> const& y) + { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + float32x4_t v = vmulq_f32(x.data, y.data); + return vaddvq_f32(v); +#else // Armv7a with Neon + float32x4_t p = vmulq_f32(x.data, y.data); + float32x2_t v = vpadd_f32(vget_low_f32(p), vget_high_f32(p)); + v = vpadd_f32(v, v); + return vget_lane_f32(v, 0); +#endif + } + }; + + template + struct compute_normalize<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + float32x4_t p = vmulq_f32(v.data, v.data); +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + p = vpaddq_f32(p, p); + p = vpaddq_f32(p, p); +#else + float32x2_t t = vpadd_f32(vget_low_f32(p), vget_high_f32(p)); + t = vpadd_f32(t, t); + p = vcombine_f32(t, t); +#endif + + float32x4_t vd = vrsqrteq_f32(p); + vec<4, float, Q> Result; + Result.data = vmulq_f32(v.data, vd); + return Result; + } + }; +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/detail/func_integer.inl b/NothinFancy/dep/include/glm/detail/func_integer.inl new file mode 100644 index 0000000..091e1e0 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_integer.inl @@ -0,0 +1,372 @@ +/// @ref core + +#include "_vectorize.hpp" +#if(GLM_ARCH & GLM_ARCH_X86 && GLM_COMPILER & GLM_COMPILER_VC) +# include +# pragma intrinsic(_BitScanReverse) +#endif//(GLM_ARCH & GLM_ARCH_X86 && GLM_COMPILER & GLM_COMPILER_VC) +#include + +#if !GLM_HAS_EXTENDED_INTEGER_TYPE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic ignored "-Wlong-long" +# endif +# if (GLM_COMPILER & GLM_COMPILER_CLANG) +# pragma clang diagnostic ignored "-Wc++11-long-long" +# endif +#endif + +namespace glm{ +namespace detail +{ + template + GLM_FUNC_QUALIFIER T mask(T Bits) + { + return Bits >= static_cast(sizeof(T) * 8) ? ~static_cast(0) : (static_cast(1) << Bits) - static_cast(1); + } + + template + struct compute_bitfieldReverseStep + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T, T) + { + return v; + } + }; + + template + struct compute_bitfieldReverseStep + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T Mask, T Shift) + { + return (v & Mask) << Shift | (v & (~Mask)) >> Shift; + } + }; + + template + struct compute_bitfieldBitCountStep + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T, T) + { + return v; + } + }; + + template + struct compute_bitfieldBitCountStep + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T Mask, T Shift) + { + return (v & Mask) + ((v >> Shift) & Mask); + } + }; + + template + struct compute_findLSB + { + GLM_FUNC_QUALIFIER static int call(genIUType Value) + { + if(Value == 0) + return -1; + + return glm::bitCount(~Value & (Value - static_cast(1))); + } + }; + +# if GLM_HAS_BITSCAN_WINDOWS + template + struct compute_findLSB + { + GLM_FUNC_QUALIFIER static int call(genIUType Value) + { + unsigned long Result(0); + unsigned char IsNotNull = _BitScanForward(&Result, *reinterpret_cast(&Value)); + return IsNotNull ? int(Result) : -1; + } + }; + +# if !((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_MODEL == GLM_MODEL_32)) + template + struct compute_findLSB + { + GLM_FUNC_QUALIFIER static int call(genIUType Value) + { + unsigned long Result(0); + unsigned char IsNotNull = _BitScanForward64(&Result, *reinterpret_cast(&Value)); + return IsNotNull ? int(Result) : -1; + } + }; +# endif +# endif//GLM_HAS_BITSCAN_WINDOWS + + template + struct compute_findMSB_step_vec + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, T Shift) + { + return x | (x >> Shift); + } + }; + + template + struct compute_findMSB_step_vec + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, T) + { + return x; + } + }; + + template + struct compute_findMSB_vec + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + vec x(v); + x = compute_findMSB_step_vec= 8>::call(x, static_cast( 1)); + x = compute_findMSB_step_vec= 8>::call(x, static_cast( 2)); + x = compute_findMSB_step_vec= 8>::call(x, static_cast( 4)); + x = compute_findMSB_step_vec= 16>::call(x, static_cast( 8)); + x = compute_findMSB_step_vec= 32>::call(x, static_cast(16)); + x = compute_findMSB_step_vec= 64>::call(x, static_cast(32)); + return vec(sizeof(T) * 8 - 1) - glm::bitCount(~x); + } + }; + +# if GLM_HAS_BITSCAN_WINDOWS + template + GLM_FUNC_QUALIFIER int compute_findMSB_32(genIUType Value) + { + unsigned long Result(0); + unsigned char IsNotNull = _BitScanReverse(&Result, *reinterpret_cast(&Value)); + return IsNotNull ? int(Result) : -1; + } + + template + struct compute_findMSB_vec + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(compute_findMSB_32, x); + } + }; + +# if !((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_MODEL == GLM_MODEL_32)) + template + GLM_FUNC_QUALIFIER int compute_findMSB_64(genIUType Value) + { + unsigned long Result(0); + unsigned char IsNotNull = _BitScanReverse64(&Result, *reinterpret_cast(&Value)); + return IsNotNull ? int(Result) : -1; + } + + template + struct compute_findMSB_vec + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(compute_findMSB_64, x); + } + }; +# endif +# endif//GLM_HAS_BITSCAN_WINDOWS +}//namespace detail + + // uaddCarry + GLM_FUNC_QUALIFIER uint uaddCarry(uint const& x, uint const& y, uint & Carry) + { + detail::uint64 const Value64(static_cast(x) + static_cast(y)); + detail::uint64 const Max32((static_cast(1) << static_cast(32)) - static_cast(1)); + Carry = Value64 > Max32 ? 1u : 0u; + return static_cast(Value64 % (Max32 + static_cast(1))); + } + + template + GLM_FUNC_QUALIFIER vec uaddCarry(vec const& x, vec const& y, vec& Carry) + { + vec Value64(vec(x) + vec(y)); + vec Max32((static_cast(1) << static_cast(32)) - static_cast(1)); + Carry = mix(vec(0), vec(1), greaterThan(Value64, Max32)); + return vec(Value64 % (Max32 + static_cast(1))); + } + + // usubBorrow + GLM_FUNC_QUALIFIER uint usubBorrow(uint const& x, uint const& y, uint & Borrow) + { + Borrow = x >= y ? static_cast(0) : static_cast(1); + if(y >= x) + return y - x; + else + return static_cast((static_cast(1) << static_cast(32)) + (static_cast(y) - static_cast(x))); + } + + template + GLM_FUNC_QUALIFIER vec usubBorrow(vec const& x, vec const& y, vec& Borrow) + { + Borrow = mix(vec(1), vec(0), greaterThanEqual(x, y)); + vec const YgeX(y - x); + vec const XgeY(vec((static_cast(1) << static_cast(32)) + (vec(y) - vec(x)))); + return mix(XgeY, YgeX, greaterThanEqual(y, x)); + } + + // umulExtended + GLM_FUNC_QUALIFIER void umulExtended(uint const& x, uint const& y, uint & msb, uint & lsb) + { + detail::uint64 Value64 = static_cast(x) * static_cast(y); + msb = static_cast(Value64 >> static_cast(32)); + lsb = static_cast(Value64); + } + + template + GLM_FUNC_QUALIFIER void umulExtended(vec const& x, vec const& y, vec& msb, vec& lsb) + { + vec Value64(vec(x) * vec(y)); + msb = vec(Value64 >> static_cast(32)); + lsb = vec(Value64); + } + + // imulExtended + GLM_FUNC_QUALIFIER void imulExtended(int x, int y, int& msb, int& lsb) + { + detail::int64 Value64 = static_cast(x) * static_cast(y); + msb = static_cast(Value64 >> static_cast(32)); + lsb = static_cast(Value64); + } + + template + GLM_FUNC_QUALIFIER void imulExtended(vec const& x, vec const& y, vec& msb, vec& lsb) + { + vec Value64(vec(x) * vec(y)); + lsb = vec(Value64 & static_cast(0xFFFFFFFF)); + msb = vec((Value64 >> static_cast(32)) & static_cast(0xFFFFFFFF)); + } + + // bitfieldExtract + template + GLM_FUNC_QUALIFIER genIUType bitfieldExtract(genIUType Value, int Offset, int Bits) + { + return bitfieldExtract(vec<1, genIUType>(Value), Offset, Bits).x; + } + + template + GLM_FUNC_QUALIFIER vec bitfieldExtract(vec const& Value, int Offset, int Bits) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldExtract' only accept integer inputs"); + + return (Value >> static_cast(Offset)) & static_cast(detail::mask(Bits)); + } + + // bitfieldInsert + template + GLM_FUNC_QUALIFIER genIUType bitfieldInsert(genIUType const& Base, genIUType const& Insert, int Offset, int Bits) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldInsert' only accept integer values"); + + return bitfieldInsert(vec<1, genIUType>(Base), vec<1, genIUType>(Insert), Offset, Bits).x; + } + + template + GLM_FUNC_QUALIFIER vec bitfieldInsert(vec const& Base, vec const& Insert, int Offset, int Bits) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldInsert' only accept integer values"); + + T const Mask = static_cast(detail::mask(Bits) << Offset); + return (Base & ~Mask) | ((Insert << static_cast(Offset)) & Mask); + } + + // bitfieldReverse + template + GLM_FUNC_QUALIFIER genIUType bitfieldReverse(genIUType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldReverse' only accept integer values"); + + return bitfieldReverse(glm::vec<1, genIUType, glm::defaultp>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec bitfieldReverse(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldReverse' only accept integer values"); + + vec x(v); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 2>::call(x, static_cast(0x5555555555555555ull), static_cast( 1)); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 4>::call(x, static_cast(0x3333333333333333ull), static_cast( 2)); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 8>::call(x, static_cast(0x0F0F0F0F0F0F0F0Full), static_cast( 4)); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 16>::call(x, static_cast(0x00FF00FF00FF00FFull), static_cast( 8)); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 32>::call(x, static_cast(0x0000FFFF0000FFFFull), static_cast(16)); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 64>::call(x, static_cast(0x00000000FFFFFFFFull), static_cast(32)); + return x; + } + + // bitCount + template + GLM_FUNC_QUALIFIER int bitCount(genIUType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitCount' only accept integer values"); + + return bitCount(glm::vec<1, genIUType, glm::defaultp>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec bitCount(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitCount' only accept integer values"); + +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable : 4310) //cast truncates constant value +# endif + + vec::type, Q> x(*reinterpret_cast::type, Q> const *>(&v)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 2>::call(x, typename detail::make_unsigned::type(0x5555555555555555ull), typename detail::make_unsigned::type( 1)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 4>::call(x, typename detail::make_unsigned::type(0x3333333333333333ull), typename detail::make_unsigned::type( 2)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 8>::call(x, typename detail::make_unsigned::type(0x0F0F0F0F0F0F0F0Full), typename detail::make_unsigned::type( 4)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 16>::call(x, typename detail::make_unsigned::type(0x00FF00FF00FF00FFull), typename detail::make_unsigned::type( 8)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 32>::call(x, typename detail::make_unsigned::type(0x0000FFFF0000FFFFull), typename detail::make_unsigned::type(16)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 64>::call(x, typename detail::make_unsigned::type(0x00000000FFFFFFFFull), typename detail::make_unsigned::type(32)); + return vec(x); + +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif + } + + // findLSB + template + GLM_FUNC_QUALIFIER int findLSB(genIUType Value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findLSB' only accept integer values"); + + return detail::compute_findLSB::call(Value); + } + + template + GLM_FUNC_QUALIFIER vec findLSB(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findLSB' only accept integer values"); + + return detail::functor1::call(findLSB, x); + } + + // findMSB + template + GLM_FUNC_QUALIFIER int findMSB(genIUType v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findMSB' only accept integer values"); + + return findMSB(vec<1, genIUType>(v)).x; + } + + template + GLM_FUNC_QUALIFIER vec findMSB(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findMSB' only accept integer values"); + + return detail::compute_findMSB_vec::call(v); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_integer_simd.inl" +#endif + diff --git a/NothinFancy/dep/include/glm/detail/func_integer_simd.inl b/NothinFancy/dep/include/glm/detail/func_integer_simd.inl new file mode 100644 index 0000000..8be6c9c --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_integer_simd.inl @@ -0,0 +1,65 @@ +#include "../simd/integer.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ + template + struct compute_bitfieldReverseStep<4, uint, Q, true, true> + { + GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& v, uint Mask, uint Shift) + { + __m128i const set0 = v.data; + + __m128i const set1 = _mm_set1_epi32(static_cast(Mask)); + __m128i const and1 = _mm_and_si128(set0, set1); + __m128i const sft1 = _mm_slli_epi32(and1, Shift); + + __m128i const set2 = _mm_andnot_si128(set0, _mm_set1_epi32(-1)); + __m128i const and2 = _mm_and_si128(set0, set2); + __m128i const sft2 = _mm_srai_epi32(and2, Shift); + + __m128i const or0 = _mm_or_si128(sft1, sft2); + + return or0; + } + }; + + template + struct compute_bitfieldBitCountStep<4, uint, Q, true, true> + { + GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& v, uint Mask, uint Shift) + { + __m128i const set0 = v.data; + + __m128i const set1 = _mm_set1_epi32(static_cast(Mask)); + __m128i const and0 = _mm_and_si128(set0, set1); + __m128i const sft0 = _mm_slli_epi32(set0, Shift); + __m128i const and1 = _mm_and_si128(sft0, set1); + __m128i const add0 = _mm_add_epi32(and0, and1); + + return add0; + } + }; +}//namespace detail + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template<> + GLM_FUNC_QUALIFIER int bitCount(uint x) + { + return _mm_popcnt_u32(x); + } + +# if(GLM_MODEL == GLM_MODEL_64) + template<> + GLM_FUNC_QUALIFIER int bitCount(detail::uint64 x) + { + return static_cast(_mm_popcnt_u64(x)); + } +# endif//GLM_MODEL +# endif//GLM_ARCH + +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/detail/func_matrix.inl b/NothinFancy/dep/include/glm/detail/func_matrix.inl new file mode 100644 index 0000000..d980c6d --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_matrix.inl @@ -0,0 +1,398 @@ +#include "../geometric.hpp" +#include + +namespace glm{ +namespace detail +{ + template + struct compute_matrixCompMult + { + GLM_FUNC_QUALIFIER static mat call(mat const& x, mat const& y) + { + mat Result; + for(length_t i = 0; i < Result.length(); ++i) + Result[i] = x[i] * y[i]; + return Result; + } + }; + + template + struct compute_transpose{}; + + template + struct compute_transpose<2, 2, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<2, 2, T, Q> call(mat<2, 2, T, Q> const& m) + { + mat<2, 2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + return Result; + } + }; + + template + struct compute_transpose<2, 3, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<3, 2, T, Q> call(mat<2, 3, T, Q> const& m) + { + mat<3,2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + return Result; + } + }; + + template + struct compute_transpose<2, 4, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<4, 2, T, Q> call(mat<2, 4, T, Q> const& m) + { + mat<4, 2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + return Result; + } + }; + + template + struct compute_transpose<3, 2, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<2, 3, T, Q> call(mat<3, 2, T, Q> const& m) + { + mat<2, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + return Result; + } + }; + + template + struct compute_transpose<3, 3, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<3, 3, T, Q> call(mat<3, 3, T, Q> const& m) + { + mat<3, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + return Result; + } + }; + + template + struct compute_transpose<3, 4, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<4, 3, T, Q> call(mat<3, 4, T, Q> const& m) + { + mat<4, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + Result[3][2] = m[2][3]; + return Result; + } + }; + + template + struct compute_transpose<4, 2, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<2, 4, T, Q> call(mat<4, 2, T, Q> const& m) + { + mat<2, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + return Result; + } + }; + + template + struct compute_transpose<4, 3, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<3, 4, T, Q> call(mat<4, 3, T, Q> const& m) + { + mat<3, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[2][3] = m[3][2]; + return Result; + } + }; + + template + struct compute_transpose<4, 4, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<4, 4, T, Q> call(mat<4, 4, T, Q> const& m) + { + mat<4, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[2][3] = m[3][2]; + + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + Result[3][2] = m[2][3]; + Result[3][3] = m[3][3]; + return Result; + } + }; + + template + struct compute_determinant{}; + + template + struct compute_determinant<2, 2, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static T call(mat<2, 2, T, Q> const& m) + { + return m[0][0] * m[1][1] - m[1][0] * m[0][1]; + } + }; + + template + struct compute_determinant<3, 3, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static T call(mat<3, 3, T, Q> const& m) + { + return + + m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) + - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) + + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + } + }; + + template + struct compute_determinant<4, 4, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static T call(mat<4, 4, T, Q> const& m) + { + T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + + vec<4, T, Q> DetCof( + + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), + - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), + - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); + + return + m[0][0] * DetCof[0] + m[0][1] * DetCof[1] + + m[0][2] * DetCof[2] + m[0][3] * DetCof[3]; + } + }; + + template + struct compute_inverse{}; + + template + struct compute_inverse<2, 2, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<2, 2, T, Q> call(mat<2, 2, T, Q> const& m) + { + T OneOverDeterminant = static_cast(1) / ( + + m[0][0] * m[1][1] + - m[1][0] * m[0][1]); + + mat<2, 2, T, Q> Inverse( + + m[1][1] * OneOverDeterminant, + - m[0][1] * OneOverDeterminant, + - m[1][0] * OneOverDeterminant, + + m[0][0] * OneOverDeterminant); + + return Inverse; + } + }; + + template + struct compute_inverse<3, 3, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<3, 3, T, Q> call(mat<3, 3, T, Q> const& m) + { + T OneOverDeterminant = static_cast(1) / ( + + m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) + - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) + + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2])); + + mat<3, 3, T, Q> Inverse; + Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDeterminant; + Inverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDeterminant; + Inverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDeterminant; + Inverse[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDeterminant; + Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDeterminant; + Inverse[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDeterminant; + Inverse[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDeterminant; + Inverse[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDeterminant; + Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDeterminant; + + return Inverse; + } + }; + + template + struct compute_inverse<4, 4, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<4, 4, T, Q> call(mat<4, 4, T, Q> const& m) + { + T Coef00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + T Coef02 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + T Coef03 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + T Coef04 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + T Coef06 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + T Coef07 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + T Coef08 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + T Coef10 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + T Coef11 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + T Coef12 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + T Coef14 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + T Coef15 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + T Coef16 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + T Coef18 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + T Coef19 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + T Coef20 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + T Coef22 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + T Coef23 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + vec<4, T, Q> Fac0(Coef00, Coef00, Coef02, Coef03); + vec<4, T, Q> Fac1(Coef04, Coef04, Coef06, Coef07); + vec<4, T, Q> Fac2(Coef08, Coef08, Coef10, Coef11); + vec<4, T, Q> Fac3(Coef12, Coef12, Coef14, Coef15); + vec<4, T, Q> Fac4(Coef16, Coef16, Coef18, Coef19); + vec<4, T, Q> Fac5(Coef20, Coef20, Coef22, Coef23); + + vec<4, T, Q> Vec0(m[1][0], m[0][0], m[0][0], m[0][0]); + vec<4, T, Q> Vec1(m[1][1], m[0][1], m[0][1], m[0][1]); + vec<4, T, Q> Vec2(m[1][2], m[0][2], m[0][2], m[0][2]); + vec<4, T, Q> Vec3(m[1][3], m[0][3], m[0][3], m[0][3]); + + vec<4, T, Q> Inv0(Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2); + vec<4, T, Q> Inv1(Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4); + vec<4, T, Q> Inv2(Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5); + vec<4, T, Q> Inv3(Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5); + + vec<4, T, Q> SignA(+1, -1, +1, -1); + vec<4, T, Q> SignB(-1, +1, -1, +1); + mat<4, 4, T, Q> Inverse(Inv0 * SignA, Inv1 * SignB, Inv2 * SignA, Inv3 * SignB); + + vec<4, T, Q> Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]); + + vec<4, T, Q> Dot0(m[0] * Row0); + T Dot1 = (Dot0.x + Dot0.y) + (Dot0.z + Dot0.w); + + T OneOverDeterminant = static_cast(1) / Dot1; + + return Inverse * OneOverDeterminant; + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER mat matrixCompMult(mat const& x, mat const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'matrixCompMult' only accept floating-point inputs"); + return detail::compute_matrixCompMult::value>::call(x, y); + } + + template + GLM_FUNC_QUALIFIER typename detail::outerProduct_trait::type outerProduct(vec const& c, vec const& r) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'outerProduct' only accept floating-point inputs"); + + typename detail::outerProduct_trait::type m; + for(length_t i = 0; i < m.length(); ++i) + m[i] = c * r[i]; + return m; + } + + template + GLM_FUNC_QUALIFIER typename mat::transpose_type transpose(mat const& m) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'transpose' only accept floating-point inputs"); + return detail::compute_transpose::value>::call(m); + } + + template + GLM_FUNC_QUALIFIER T determinant(mat const& m) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'determinant' only accept floating-point inputs"); + return detail::compute_determinant::value>::call(m); + } + + template + GLM_FUNC_QUALIFIER mat inverse(mat const& m) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'inverse' only accept floating-point inputs"); + return detail::compute_inverse::value>::call(m); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_matrix_simd.inl" +#endif + diff --git a/NothinFancy/dep/include/glm/detail/func_matrix_simd.inl b/NothinFancy/dep/include/glm/detail/func_matrix_simd.inl new file mode 100644 index 0000000..f67ac66 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_matrix_simd.inl @@ -0,0 +1,249 @@ +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +#include "type_mat4x4.hpp" +#include "../geometric.hpp" +#include "../simd/matrix.h" +#include + +namespace glm{ +namespace detail +{ +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE + template + struct compute_matrixCompMult<4, 4, float, Q, true> + { + GLM_STATIC_ASSERT(detail::is_aligned::value, "Specialization requires aligned"); + + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& x, mat<4, 4, float, Q> const& y) + { + mat<4, 4, float, Q> Result; + glm_mat4_matrixCompMult( + *static_cast(&x[0].data), + *static_cast(&y[0].data), + *static_cast(&Result[0].data)); + return Result; + } + }; +# endif + + template + struct compute_transpose<4, 4, float, Q, true> + { + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& m) + { + mat<4, 4, float, Q> Result; + glm_mat4_transpose(&m[0].data, &Result[0].data); + return Result; + } + }; + + template + struct compute_determinant<4, 4, float, Q, true> + { + GLM_FUNC_QUALIFIER static float call(mat<4, 4, float, Q> const& m) + { + return _mm_cvtss_f32(glm_mat4_determinant(&m[0].data)); + } + }; + + template + struct compute_inverse<4, 4, float, Q, true> + { + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& m) + { + mat<4, 4, float, Q> Result; + glm_mat4_inverse(&m[0].data, &Result[0].data); + return Result; + } + }; +}//namespace detail + +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE + template<> + GLM_FUNC_QUALIFIER mat<4, 4, float, aligned_lowp> outerProduct<4, 4, float, aligned_lowp>(vec<4, float, aligned_lowp> const& c, vec<4, float, aligned_lowp> const& r) + { + __m128 NativeResult[4]; + glm_mat4_outerProduct(c.data, r.data, NativeResult); + mat<4, 4, float, aligned_lowp> Result; + std::memcpy(&Result[0], &NativeResult[0], sizeof(Result)); + return Result; + } + + template<> + GLM_FUNC_QUALIFIER mat<4, 4, float, aligned_mediump> outerProduct<4, 4, float, aligned_mediump>(vec<4, float, aligned_mediump> const& c, vec<4, float, aligned_mediump> const& r) + { + __m128 NativeResult[4]; + glm_mat4_outerProduct(c.data, r.data, NativeResult); + mat<4, 4, float, aligned_mediump> Result; + std::memcpy(&Result[0], &NativeResult[0], sizeof(Result)); + return Result; + } + + template<> + GLM_FUNC_QUALIFIER mat<4, 4, float, aligned_highp> outerProduct<4, 4, float, aligned_highp>(vec<4, float, aligned_highp> const& c, vec<4, float, aligned_highp> const& r) + { + __m128 NativeResult[4]; + glm_mat4_outerProduct(c.data, r.data, NativeResult); + mat<4, 4, float, aligned_highp> Result; + std::memcpy(&Result[0], &NativeResult[0], sizeof(Result)); + return Result; + } +# endif +}//namespace glm + +#elif GLM_ARCH & GLM_ARCH_NEON_BIT + +namespace glm { +#if GLM_LANG & GLM_LANG_CXX11_FLAG + template + GLM_FUNC_QUALIFIER + typename std::enable_if::value, mat<4, 4, float, Q>>::type + operator*(mat<4, 4, float, Q> const & m1, mat<4, 4, float, Q> const & m2) + { + auto MulRow = [&](int l) { + float32x4_t const SrcA = m2[l].data; + + float32x4_t r = neon::mul_lane(m1[0].data, SrcA, 0); + r = neon::madd_lane(r, m1[1].data, SrcA, 1); + r = neon::madd_lane(r, m1[2].data, SrcA, 2); + r = neon::madd_lane(r, m1[3].data, SrcA, 3); + + return r; + }; + + mat<4, 4, float, aligned_highp> Result; + Result[0].data = MulRow(0); + Result[1].data = MulRow(1); + Result[2].data = MulRow(2); + Result[3].data = MulRow(3); + + return Result; + } +#endif // CXX11 + + template + struct detail::compute_inverse<4, 4, float, Q, true> + { + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& m) + { + float32x4_t const& m0 = m[0].data; + float32x4_t const& m1 = m[1].data; + float32x4_t const& m2 = m[2].data; + float32x4_t const& m3 = m[3].data; + + // m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + float32x4_t Fac0; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 2), neon::dup_lane(m1, 2)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 3), 3, m2, 3); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 2), 3, m2, 2); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 3), neon::dup_lane(m1, 3)); + Fac0 = w0 * w1 - w2 * w3; + } + + // m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + float32x4_t Fac1; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 1), neon::dup_lane(m1, 1)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 3), 3, m2, 3); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 1), 3, m2, 1); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 3), neon::dup_lane(m1, 3)); + Fac1 = w0 * w1 - w2 * w3; + } + + // m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + float32x4_t Fac2; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 1), neon::dup_lane(m1, 1)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 2), 3, m2, 2); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 1), 3, m2, 1); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 2), neon::dup_lane(m1, 2)); + Fac2 = w0 * w1 - w2 * w3; + } + + // m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + float32x4_t Fac3; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 0), neon::dup_lane(m1, 0)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 3), 3, m2, 3); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 0), 3, m2, 0); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 3), neon::dup_lane(m1, 3)); + Fac3 = w0 * w1 - w2 * w3; + } + + // m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + float32x4_t Fac4; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 0), neon::dup_lane(m1, 0)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 2), 3, m2, 2); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 0), 3, m2, 0); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 2), neon::dup_lane(m1, 2)); + Fac4 = w0 * w1 - w2 * w3; + } + + // m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + float32x4_t Fac5; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 0), neon::dup_lane(m1, 0)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 1), 3, m2, 1); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 0), 3, m2, 0); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 1), neon::dup_lane(m1, 1)); + Fac5 = w0 * w1 - w2 * w3; + } + + float32x4_t Vec0 = neon::copy_lane(neon::dupq_lane(m0, 0), 0, m1, 0); // (m[1][0], m[0][0], m[0][0], m[0][0]); + float32x4_t Vec1 = neon::copy_lane(neon::dupq_lane(m0, 1), 0, m1, 1); // (m[1][1], m[0][1], m[0][1], m[0][1]); + float32x4_t Vec2 = neon::copy_lane(neon::dupq_lane(m0, 2), 0, m1, 2); // (m[1][2], m[0][2], m[0][2], m[0][2]); + float32x4_t Vec3 = neon::copy_lane(neon::dupq_lane(m0, 3), 0, m1, 3); // (m[1][3], m[0][3], m[0][3], m[0][3]); + + float32x4_t Inv0 = Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2; + float32x4_t Inv1 = Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4; + float32x4_t Inv2 = Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5; + float32x4_t Inv3 = Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5; + + float32x4_t r0 = float32x4_t{-1, +1, -1, +1} * Inv0; + float32x4_t r1 = float32x4_t{+1, -1, +1, -1} * Inv1; + float32x4_t r2 = float32x4_t{-1, +1, -1, +1} * Inv2; + float32x4_t r3 = float32x4_t{+1, -1, +1, -1} * Inv3; + + float32x4_t det = neon::mul_lane(r0, m0, 0); + det = neon::madd_lane(det, r1, m0, 1); + det = neon::madd_lane(det, r2, m0, 2); + det = neon::madd_lane(det, r3, m0, 3); + + float32x4_t rdet = vdupq_n_f32(1 / vgetq_lane_f32(det, 0)); + + mat<4, 4, float, Q> r; + r[0].data = vmulq_f32(r0, rdet); + r[1].data = vmulq_f32(r1, rdet); + r[2].data = vmulq_f32(r2, rdet); + r[3].data = vmulq_f32(r3, rdet); + return r; + } + }; +}//namespace glm +#endif diff --git a/NothinFancy/dep/include/glm/detail/func_packing.inl b/NothinFancy/dep/include/glm/detail/func_packing.inl new file mode 100644 index 0000000..234b093 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_packing.inl @@ -0,0 +1,189 @@ +/// @ref core +/// @file glm/detail/func_packing.inl + +#include "../common.hpp" +#include "type_half.hpp" + +namespace glm +{ + GLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const& v) + { + union + { + unsigned short in[2]; + uint out; + } u; + + vec<2, unsigned short, defaultp> result(round(clamp(v, 0.0f, 1.0f) * 65535.0f)); + + u.in[0] = result[0]; + u.in[1] = result[1]; + + return u.out; + } + + GLM_FUNC_QUALIFIER vec2 unpackUnorm2x16(uint p) + { + union + { + uint in; + unsigned short out[2]; + } u; + + u.in = p; + + return vec2(u.out[0], u.out[1]) * 1.5259021896696421759365224689097e-5f; + } + + GLM_FUNC_QUALIFIER uint packSnorm2x16(vec2 const& v) + { + union + { + signed short in[2]; + uint out; + } u; + + vec<2, short, defaultp> result(round(clamp(v, -1.0f, 1.0f) * 32767.0f)); + + u.in[0] = result[0]; + u.in[1] = result[1]; + + return u.out; + } + + GLM_FUNC_QUALIFIER vec2 unpackSnorm2x16(uint p) + { + union + { + uint in; + signed short out[2]; + } u; + + u.in = p; + + return clamp(vec2(u.out[0], u.out[1]) * 3.0518509475997192297128208258309e-5f, -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint packUnorm4x8(vec4 const& v) + { + union + { + unsigned char in[4]; + uint out; + } u; + + vec<4, unsigned char, defaultp> result(round(clamp(v, 0.0f, 1.0f) * 255.0f)); + + u.in[0] = result[0]; + u.in[1] = result[1]; + u.in[2] = result[2]; + u.in[3] = result[3]; + + return u.out; + } + + GLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint p) + { + union + { + uint in; + unsigned char out[4]; + } u; + + u.in = p; + + return vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0039215686274509803921568627451f; + } + + GLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const& v) + { + union + { + signed char in[4]; + uint out; + } u; + + vec<4, signed char, defaultp> result(round(clamp(v, -1.0f, 1.0f) * 127.0f)); + + u.in[0] = result[0]; + u.in[1] = result[1]; + u.in[2] = result[2]; + u.in[3] = result[3]; + + return u.out; + } + + GLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint p) + { + union + { + uint in; + signed char out[4]; + } u; + + u.in = p; + + return clamp(vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0078740157480315f, -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER double packDouble2x32(uvec2 const& v) + { + union + { + uint in[2]; + double out; + } u; + + u.in[0] = v[0]; + u.in[1] = v[1]; + + return u.out; + } + + GLM_FUNC_QUALIFIER uvec2 unpackDouble2x32(double v) + { + union + { + double in; + uint out[2]; + } u; + + u.in = v; + + return uvec2(u.out[0], u.out[1]); + } + + GLM_FUNC_QUALIFIER uint packHalf2x16(vec2 const& v) + { + union + { + signed short in[2]; + uint out; + } u; + + u.in[0] = detail::toFloat16(v.x); + u.in[1] = detail::toFloat16(v.y); + + return u.out; + } + + GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint v) + { + union + { + uint in; + signed short out[2]; + } u; + + u.in = v; + + return vec2( + detail::toFloat32(u.out[0]), + detail::toFloat32(u.out[1])); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_packing_simd.inl" +#endif + diff --git a/NothinFancy/dep/include/glm/detail/func_packing_simd.inl b/NothinFancy/dep/include/glm/detail/func_packing_simd.inl new file mode 100644 index 0000000..fd0fe8b --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_packing_simd.inl @@ -0,0 +1,6 @@ +namespace glm{ +namespace detail +{ + +}//namespace detail +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/func_trigonometric.inl b/NothinFancy/dep/include/glm/detail/func_trigonometric.inl new file mode 100644 index 0000000..e129dce --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_trigonometric.inl @@ -0,0 +1,197 @@ +#include "_vectorize.hpp" +#include +#include + +namespace glm +{ + // radians + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType radians(genType degrees) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'radians' only accept floating-point input"); + + return degrees * static_cast(0.01745329251994329576923690768489); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec radians(vec const& v) + { + return detail::functor1::call(radians, v); + } + + // degrees + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType degrees(genType radians) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'degrees' only accept floating-point input"); + + return radians * static_cast(57.295779513082320876798154814105); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec degrees(vec const& v) + { + return detail::functor1::call(degrees, v); + } + + // sin + using ::std::sin; + + template + GLM_FUNC_QUALIFIER vec sin(vec const& v) + { + return detail::functor1::call(sin, v); + } + + // cos + using std::cos; + + template + GLM_FUNC_QUALIFIER vec cos(vec const& v) + { + return detail::functor1::call(cos, v); + } + + // tan + using std::tan; + + template + GLM_FUNC_QUALIFIER vec tan(vec const& v) + { + return detail::functor1::call(tan, v); + } + + // asin + using std::asin; + + template + GLM_FUNC_QUALIFIER vec asin(vec const& v) + { + return detail::functor1::call(asin, v); + } + + // acos + using std::acos; + + template + GLM_FUNC_QUALIFIER vec acos(vec const& v) + { + return detail::functor1::call(acos, v); + } + + // atan + template + GLM_FUNC_QUALIFIER genType atan(genType y, genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'atan' only accept floating-point input"); + + return ::std::atan2(y, x); + } + + template + GLM_FUNC_QUALIFIER vec atan(vec const& a, vec const& b) + { + return detail::functor2::call(::std::atan2, a, b); + } + + using std::atan; + + template + GLM_FUNC_QUALIFIER vec atan(vec const& v) + { + return detail::functor1::call(atan, v); + } + + // sinh + using std::sinh; + + template + GLM_FUNC_QUALIFIER vec sinh(vec const& v) + { + return detail::functor1::call(sinh, v); + } + + // cosh + using std::cosh; + + template + GLM_FUNC_QUALIFIER vec cosh(vec const& v) + { + return detail::functor1::call(cosh, v); + } + + // tanh + using std::tanh; + + template + GLM_FUNC_QUALIFIER vec tanh(vec const& v) + { + return detail::functor1::call(tanh, v); + } + + // asinh +# if GLM_HAS_CXX11_STL + using std::asinh; +# else + template + GLM_FUNC_QUALIFIER genType asinh(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'asinh' only accept floating-point input"); + + return (x < static_cast(0) ? static_cast(-1) : (x > static_cast(0) ? static_cast(1) : static_cast(0))) * log(std::abs(x) + sqrt(static_cast(1) + x * x)); + } +# endif + + template + GLM_FUNC_QUALIFIER vec asinh(vec const& v) + { + return detail::functor1::call(asinh, v); + } + + // acosh +# if GLM_HAS_CXX11_STL + using std::acosh; +# else + template + GLM_FUNC_QUALIFIER genType acosh(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acosh' only accept floating-point input"); + + if(x < static_cast(1)) + return static_cast(0); + return log(x + sqrt(x * x - static_cast(1))); + } +# endif + + template + GLM_FUNC_QUALIFIER vec acosh(vec const& v) + { + return detail::functor1::call(acosh, v); + } + + // atanh +# if GLM_HAS_CXX11_STL + using std::atanh; +# else + template + GLM_FUNC_QUALIFIER genType atanh(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'atanh' only accept floating-point input"); + + if(std::abs(x) >= static_cast(1)) + return 0; + return static_cast(0.5) * log((static_cast(1) + x) / (static_cast(1) - x)); + } +# endif + + template + GLM_FUNC_QUALIFIER vec atanh(vec const& v) + { + return detail::functor1::call(atanh, v); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_trigonometric_simd.inl" +#endif + diff --git a/NothinFancy/dep/include/glm/detail/func_trigonometric_simd.inl b/NothinFancy/dep/include/glm/detail/func_trigonometric_simd.inl new file mode 100644 index 0000000..e69de29 diff --git a/NothinFancy/dep/include/glm/detail/func_vector_relational.inl b/NothinFancy/dep/include/glm/detail/func_vector_relational.inl new file mode 100644 index 0000000..80c9e87 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_vector_relational.inl @@ -0,0 +1,87 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec lessThan(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] < y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec lessThanEqual(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] <= y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec greaterThan(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] > y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec greaterThanEqual(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] >= y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] == y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] != y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool any(vec const& v) + { + bool Result = false; + for(length_t i = 0; i < L; ++i) + Result = Result || v[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool all(vec const& v) + { + bool Result = true; + for(length_t i = 0; i < L; ++i) + Result = Result && v[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec not_(vec const& v) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = !v[i]; + return Result; + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_vector_relational_simd.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/func_vector_relational_simd.inl b/NothinFancy/dep/include/glm/detail/func_vector_relational_simd.inl new file mode 100644 index 0000000..fd0fe8b --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/func_vector_relational_simd.inl @@ -0,0 +1,6 @@ +namespace glm{ +namespace detail +{ + +}//namespace detail +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/glm.cpp b/NothinFancy/dep/include/glm/detail/glm.cpp new file mode 100644 index 0000000..e0755bd --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/glm.cpp @@ -0,0 +1,263 @@ +/// @ref core +/// @file glm/glm.cpp + +#ifndef GLM_ENABLE_EXPERIMENTAL +#define GLM_ENABLE_EXPERIMENTAL +#endif +#include +#include +#include +#include +#include +#include + +namespace glm +{ +// tvec1 type explicit instantiation +template struct vec<1, uint8, lowp>; +template struct vec<1, uint16, lowp>; +template struct vec<1, uint32, lowp>; +template struct vec<1, uint64, lowp>; +template struct vec<1, int8, lowp>; +template struct vec<1, int16, lowp>; +template struct vec<1, int32, lowp>; +template struct vec<1, int64, lowp>; +template struct vec<1, float32, lowp>; +template struct vec<1, float64, lowp>; + +template struct vec<1, uint8, mediump>; +template struct vec<1, uint16, mediump>; +template struct vec<1, uint32, mediump>; +template struct vec<1, uint64, mediump>; +template struct vec<1, int8, mediump>; +template struct vec<1, int16, mediump>; +template struct vec<1, int32, mediump>; +template struct vec<1, int64, mediump>; +template struct vec<1, float32, mediump>; +template struct vec<1, float64, mediump>; + +template struct vec<1, uint8, highp>; +template struct vec<1, uint16, highp>; +template struct vec<1, uint32, highp>; +template struct vec<1, uint64, highp>; +template struct vec<1, int8, highp>; +template struct vec<1, int16, highp>; +template struct vec<1, int32, highp>; +template struct vec<1, int64, highp>; +template struct vec<1, float32, highp>; +template struct vec<1, float64, highp>; + +// tvec2 type explicit instantiation +template struct vec<2, uint8, lowp>; +template struct vec<2, uint16, lowp>; +template struct vec<2, uint32, lowp>; +template struct vec<2, uint64, lowp>; +template struct vec<2, int8, lowp>; +template struct vec<2, int16, lowp>; +template struct vec<2, int32, lowp>; +template struct vec<2, int64, lowp>; +template struct vec<2, float32, lowp>; +template struct vec<2, float64, lowp>; + +template struct vec<2, uint8, mediump>; +template struct vec<2, uint16, mediump>; +template struct vec<2, uint32, mediump>; +template struct vec<2, uint64, mediump>; +template struct vec<2, int8, mediump>; +template struct vec<2, int16, mediump>; +template struct vec<2, int32, mediump>; +template struct vec<2, int64, mediump>; +template struct vec<2, float32, mediump>; +template struct vec<2, float64, mediump>; + +template struct vec<2, uint8, highp>; +template struct vec<2, uint16, highp>; +template struct vec<2, uint32, highp>; +template struct vec<2, uint64, highp>; +template struct vec<2, int8, highp>; +template struct vec<2, int16, highp>; +template struct vec<2, int32, highp>; +template struct vec<2, int64, highp>; +template struct vec<2, float32, highp>; +template struct vec<2, float64, highp>; + +// tvec3 type explicit instantiation +template struct vec<3, uint8, lowp>; +template struct vec<3, uint16, lowp>; +template struct vec<3, uint32, lowp>; +template struct vec<3, uint64, lowp>; +template struct vec<3, int8, lowp>; +template struct vec<3, int16, lowp>; +template struct vec<3, int32, lowp>; +template struct vec<3, int64, lowp>; +template struct vec<3, float32, lowp>; +template struct vec<3, float64, lowp>; + +template struct vec<3, uint8, mediump>; +template struct vec<3, uint16, mediump>; +template struct vec<3, uint32, mediump>; +template struct vec<3, uint64, mediump>; +template struct vec<3, int8, mediump>; +template struct vec<3, int16, mediump>; +template struct vec<3, int32, mediump>; +template struct vec<3, int64, mediump>; +template struct vec<3, float32, mediump>; +template struct vec<3, float64, mediump>; + +template struct vec<3, uint8, highp>; +template struct vec<3, uint16, highp>; +template struct vec<3, uint32, highp>; +template struct vec<3, uint64, highp>; +template struct vec<3, int8, highp>; +template struct vec<3, int16, highp>; +template struct vec<3, int32, highp>; +template struct vec<3, int64, highp>; +template struct vec<3, float32, highp>; +template struct vec<3, float64, highp>; + +// tvec4 type explicit instantiation +template struct vec<4, uint8, lowp>; +template struct vec<4, uint16, lowp>; +template struct vec<4, uint32, lowp>; +template struct vec<4, uint64, lowp>; +template struct vec<4, int8, lowp>; +template struct vec<4, int16, lowp>; +template struct vec<4, int32, lowp>; +template struct vec<4, int64, lowp>; +template struct vec<4, float32, lowp>; +template struct vec<4, float64, lowp>; + +template struct vec<4, uint8, mediump>; +template struct vec<4, uint16, mediump>; +template struct vec<4, uint32, mediump>; +template struct vec<4, uint64, mediump>; +template struct vec<4, int8, mediump>; +template struct vec<4, int16, mediump>; +template struct vec<4, int32, mediump>; +template struct vec<4, int64, mediump>; +template struct vec<4, float32, mediump>; +template struct vec<4, float64, mediump>; + +template struct vec<4, uint8, highp>; +template struct vec<4, uint16, highp>; +template struct vec<4, uint32, highp>; +template struct vec<4, uint64, highp>; +template struct vec<4, int8, highp>; +template struct vec<4, int16, highp>; +template struct vec<4, int32, highp>; +template struct vec<4, int64, highp>; +template struct vec<4, float32, highp>; +template struct vec<4, float64, highp>; + +// tmat2x2 type explicit instantiation +template struct mat<2, 2, float32, lowp>; +template struct mat<2, 2, float64, lowp>; + +template struct mat<2, 2, float32, mediump>; +template struct mat<2, 2, float64, mediump>; + +template struct mat<2, 2, float32, highp>; +template struct mat<2, 2, float64, highp>; + +// tmat2x3 type explicit instantiation +template struct mat<2, 3, float32, lowp>; +template struct mat<2, 3, float64, lowp>; + +template struct mat<2, 3, float32, mediump>; +template struct mat<2, 3, float64, mediump>; + +template struct mat<2, 3, float32, highp>; +template struct mat<2, 3, float64, highp>; + +// tmat2x4 type explicit instantiation +template struct mat<2, 4, float32, lowp>; +template struct mat<2, 4, float64, lowp>; + +template struct mat<2, 4, float32, mediump>; +template struct mat<2, 4, float64, mediump>; + +template struct mat<2, 4, float32, highp>; +template struct mat<2, 4, float64, highp>; + +// tmat3x2 type explicit instantiation +template struct mat<3, 2, float32, lowp>; +template struct mat<3, 2, float64, lowp>; + +template struct mat<3, 2, float32, mediump>; +template struct mat<3, 2, float64, mediump>; + +template struct mat<3, 2, float32, highp>; +template struct mat<3, 2, float64, highp>; + +// tmat3x3 type explicit instantiation +template struct mat<3, 3, float32, lowp>; +template struct mat<3, 3, float64, lowp>; + +template struct mat<3, 3, float32, mediump>; +template struct mat<3, 3, float64, mediump>; + +template struct mat<3, 3, float32, highp>; +template struct mat<3, 3, float64, highp>; + +// tmat3x4 type explicit instantiation +template struct mat<3, 4, float32, lowp>; +template struct mat<3, 4, float64, lowp>; + +template struct mat<3, 4, float32, mediump>; +template struct mat<3, 4, float64, mediump>; + +template struct mat<3, 4, float32, highp>; +template struct mat<3, 4, float64, highp>; + +// tmat4x2 type explicit instantiation +template struct mat<4, 2, float32, lowp>; +template struct mat<4, 2, float64, lowp>; + +template struct mat<4, 2, float32, mediump>; +template struct mat<4, 2, float64, mediump>; + +template struct mat<4, 2, float32, highp>; +template struct mat<4, 2, float64, highp>; + +// tmat4x3 type explicit instantiation +template struct mat<4, 3, float32, lowp>; +template struct mat<4, 3, float64, lowp>; + +template struct mat<4, 3, float32, mediump>; +template struct mat<4, 3, float64, mediump>; + +template struct mat<4, 3, float32, highp>; +template struct mat<4, 3, float64, highp>; + +// tmat4x4 type explicit instantiation +template struct mat<4, 4, float32, lowp>; +template struct mat<4, 4, float64, lowp>; + +template struct mat<4, 4, float32, mediump>; +template struct mat<4, 4, float64, mediump>; + +template struct mat<4, 4, float32, highp>; +template struct mat<4, 4, float64, highp>; + +// tquat type explicit instantiation +template struct qua; +template struct qua; + +template struct qua; +template struct qua; + +template struct qua; +template struct qua; + +//tdualquat type explicit instantiation +template struct tdualquat; +template struct tdualquat; + +template struct tdualquat; +template struct tdualquat; + +template struct tdualquat; +template struct tdualquat; + +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/detail/qualifier.hpp b/NothinFancy/dep/include/glm/detail/qualifier.hpp new file mode 100644 index 0000000..b6c9df0 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/qualifier.hpp @@ -0,0 +1,230 @@ +#pragma once + +#include "setup.hpp" + +namespace glm +{ + /// Qualify GLM types in term of alignment (packed, aligned) and precision in term of ULPs (lowp, mediump, highp) + enum qualifier + { + packed_highp, ///< Typed data is tightly packed in memory and operations are executed with high precision in term of ULPs + packed_mediump, ///< Typed data is tightly packed in memory and operations are executed with medium precision in term of ULPs for higher performance + packed_lowp, ///< Typed data is tightly packed in memory and operations are executed with low precision in term of ULPs to maximize performance + +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE + aligned_highp, ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs + aligned_mediump, ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs for higher performance + aligned_lowp, // ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs to maximize performance + aligned = aligned_highp, ///< By default aligned qualifier is also high precision +# endif + + highp = packed_highp, ///< By default highp qualifier is also packed + mediump = packed_mediump, ///< By default mediump qualifier is also packed + lowp = packed_lowp, ///< By default lowp qualifier is also packed + packed = packed_highp, ///< By default packed qualifier is also high precision + +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE && defined(GLM_FORCE_DEFAULT_ALIGNED_GENTYPES) + defaultp = aligned_highp +# else + defaultp = highp +# endif + }; + + typedef qualifier precision; + + template struct vec; + template struct mat; + template struct qua; + +# if GLM_HAS_TEMPLATE_ALIASES + template using tvec1 = vec<1, T, Q>; + template using tvec2 = vec<2, T, Q>; + template using tvec3 = vec<3, T, Q>; + template using tvec4 = vec<4, T, Q>; + template using tmat2x2 = mat<2, 2, T, Q>; + template using tmat2x3 = mat<2, 3, T, Q>; + template using tmat2x4 = mat<2, 4, T, Q>; + template using tmat3x2 = mat<3, 2, T, Q>; + template using tmat3x3 = mat<3, 3, T, Q>; + template using tmat3x4 = mat<3, 4, T, Q>; + template using tmat4x2 = mat<4, 2, T, Q>; + template using tmat4x3 = mat<4, 3, T, Q>; + template using tmat4x4 = mat<4, 4, T, Q>; + template using tquat = qua; +# endif + +namespace detail +{ + template + struct is_aligned + { + static const bool value = false; + }; + +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE + template<> + struct is_aligned + { + static const bool value = true; + }; + + template<> + struct is_aligned + { + static const bool value = true; + }; + + template<> + struct is_aligned + { + static const bool value = true; + }; +# endif + + template + struct storage + { + typedef struct type { + T data[L]; + } type; + }; + +# if GLM_HAS_ALIGNOF + template + struct storage + { + typedef struct alignas(L * sizeof(T)) type { + T data[L]; + } type; + }; + + template + struct storage<3, T, true> + { + typedef struct alignas(4 * sizeof(T)) type { + T data[4]; + } type; + }; +# endif + +# if GLM_ARCH & GLM_ARCH_SSE2_BIT + template<> + struct storage<4, float, true> + { + typedef glm_f32vec4 type; + }; + + template<> + struct storage<4, int, true> + { + typedef glm_i32vec4 type; + }; + + template<> + struct storage<4, unsigned int, true> + { + typedef glm_u32vec4 type; + }; + + template<> + struct storage<2, double, true> + { + typedef glm_f64vec2 type; + }; + + template<> + struct storage<2, detail::int64, true> + { + typedef glm_i64vec2 type; + }; + + template<> + struct storage<2, detail::uint64, true> + { + typedef glm_u64vec2 type; + }; +# endif + +# if (GLM_ARCH & GLM_ARCH_AVX_BIT) + template<> + struct storage<4, double, true> + { + typedef glm_f64vec4 type; + }; +# endif + +# if (GLM_ARCH & GLM_ARCH_AVX2_BIT) + template<> + struct storage<4, detail::int64, true> + { + typedef glm_i64vec4 type; + }; + + template<> + struct storage<4, detail::uint64, true> + { + typedef glm_u64vec4 type; + }; +# endif + +# if GLM_ARCH & GLM_ARCH_NEON_BIT + template<> + struct storage<4, float, true> + { + typedef glm_f32vec4 type; + }; + + template<> + struct storage<4, int, true> + { + typedef glm_i32vec4 type; + }; + + template<> + struct storage<4, unsigned int, true> + { + typedef glm_u32vec4 type; + }; +# endif + + enum genTypeEnum + { + GENTYPE_VEC, + GENTYPE_MAT, + GENTYPE_QUAT + }; + + template + struct genTypeTrait + {}; + + template + struct genTypeTrait > + { + static const genTypeEnum GENTYPE = GENTYPE_MAT; + }; + + template + struct init_gentype + { + }; + + template + struct init_gentype + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genType identity() + { + return genType(1, 0, 0, 0); + } + }; + + template + struct init_gentype + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genType identity() + { + return genType(1); + } + }; +}//namespace detail +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/setup.hpp b/NothinFancy/dep/include/glm/detail/setup.hpp new file mode 100644 index 0000000..2c01e02 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/setup.hpp @@ -0,0 +1,1135 @@ +#ifndef GLM_SETUP_INCLUDED + +#include +#include + +#define GLM_VERSION_MAJOR 0 +#define GLM_VERSION_MINOR 9 +#define GLM_VERSION_PATCH 9 +#define GLM_VERSION_REVISION 8 +#define GLM_VERSION 998 +#define GLM_VERSION_MESSAGE "GLM: version 0.9.9.8" + +#define GLM_SETUP_INCLUDED GLM_VERSION + +/////////////////////////////////////////////////////////////////////////////////// +// Active states + +#define GLM_DISABLE 0 +#define GLM_ENABLE 1 + +/////////////////////////////////////////////////////////////////////////////////// +// Messages + +#if defined(GLM_FORCE_MESSAGES) +# define GLM_MESSAGES GLM_ENABLE +#else +# define GLM_MESSAGES GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Detect the platform + +#include "../simd/platform.h" + +/////////////////////////////////////////////////////////////////////////////////// +// Build model + +#if defined(_M_ARM64) || defined(__LP64__) || defined(_M_X64) || defined(__ppc64__) || defined(__x86_64__) +# define GLM_MODEL GLM_MODEL_64 +#elif defined(__i386__) || defined(__ppc__) || defined(__ILP32__) || defined(_M_ARM) +# define GLM_MODEL GLM_MODEL_32 +#else +# define GLM_MODEL GLM_MODEL_32 +#endif// + +#if !defined(GLM_MODEL) && GLM_COMPILER != 0 +# error "GLM_MODEL undefined, your compiler may not be supported by GLM. Add #define GLM_MODEL 0 to ignore this message." +#endif//GLM_MODEL + +/////////////////////////////////////////////////////////////////////////////////// +// C++ Version + +// User defines: GLM_FORCE_CXX98, GLM_FORCE_CXX03, GLM_FORCE_CXX11, GLM_FORCE_CXX14, GLM_FORCE_CXX17, GLM_FORCE_CXX2A + +#define GLM_LANG_CXX98_FLAG (1 << 1) +#define GLM_LANG_CXX03_FLAG (1 << 2) +#define GLM_LANG_CXX0X_FLAG (1 << 3) +#define GLM_LANG_CXX11_FLAG (1 << 4) +#define GLM_LANG_CXX14_FLAG (1 << 5) +#define GLM_LANG_CXX17_FLAG (1 << 6) +#define GLM_LANG_CXX2A_FLAG (1 << 7) +#define GLM_LANG_CXXMS_FLAG (1 << 8) +#define GLM_LANG_CXXGNU_FLAG (1 << 9) + +#define GLM_LANG_CXX98 GLM_LANG_CXX98_FLAG +#define GLM_LANG_CXX03 (GLM_LANG_CXX98 | GLM_LANG_CXX03_FLAG) +#define GLM_LANG_CXX0X (GLM_LANG_CXX03 | GLM_LANG_CXX0X_FLAG) +#define GLM_LANG_CXX11 (GLM_LANG_CXX0X | GLM_LANG_CXX11_FLAG) +#define GLM_LANG_CXX14 (GLM_LANG_CXX11 | GLM_LANG_CXX14_FLAG) +#define GLM_LANG_CXX17 (GLM_LANG_CXX14 | GLM_LANG_CXX17_FLAG) +#define GLM_LANG_CXX2A (GLM_LANG_CXX17 | GLM_LANG_CXX2A_FLAG) +#define GLM_LANG_CXXMS GLM_LANG_CXXMS_FLAG +#define GLM_LANG_CXXGNU GLM_LANG_CXXGNU_FLAG + +#if (defined(_MSC_EXTENSIONS)) +# define GLM_LANG_EXT GLM_LANG_CXXMS_FLAG +#elif ((GLM_COMPILER & (GLM_COMPILER_CLANG | GLM_COMPILER_GCC)) && (GLM_ARCH & GLM_ARCH_SIMD_BIT)) +# define GLM_LANG_EXT GLM_LANG_CXXMS_FLAG +#else +# define GLM_LANG_EXT 0 +#endif + +#if (defined(GLM_FORCE_CXX_UNKNOWN)) +# define GLM_LANG 0 +#elif defined(GLM_FORCE_CXX2A) +# define GLM_LANG (GLM_LANG_CXX2A | GLM_LANG_EXT) +# define GLM_LANG_STL11_FORCED +#elif defined(GLM_FORCE_CXX17) +# define GLM_LANG (GLM_LANG_CXX17 | GLM_LANG_EXT) +# define GLM_LANG_STL11_FORCED +#elif defined(GLM_FORCE_CXX14) +# define GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_EXT) +# define GLM_LANG_STL11_FORCED +#elif defined(GLM_FORCE_CXX11) +# define GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_EXT) +# define GLM_LANG_STL11_FORCED +#elif defined(GLM_FORCE_CXX03) +# define GLM_LANG (GLM_LANG_CXX03 | GLM_LANG_EXT) +#elif defined(GLM_FORCE_CXX98) +# define GLM_LANG (GLM_LANG_CXX98 | GLM_LANG_EXT) +#else +# if GLM_COMPILER & GLM_COMPILER_VC && defined(_MSVC_LANG) +# if GLM_COMPILER >= GLM_COMPILER_VC15_7 +# define GLM_LANG_PLATFORM _MSVC_LANG +# elif GLM_COMPILER >= GLM_COMPILER_VC15 +# if _MSVC_LANG > 201402L +# define GLM_LANG_PLATFORM 201402L +# else +# define GLM_LANG_PLATFORM _MSVC_LANG +# endif +# else +# define GLM_LANG_PLATFORM 0 +# endif +# else +# define GLM_LANG_PLATFORM 0 +# endif + +# if __cplusplus > 201703L || GLM_LANG_PLATFORM > 201703L +# define GLM_LANG (GLM_LANG_CXX2A | GLM_LANG_EXT) +# elif __cplusplus == 201703L || GLM_LANG_PLATFORM == 201703L +# define GLM_LANG (GLM_LANG_CXX17 | GLM_LANG_EXT) +# elif __cplusplus == 201402L || __cplusplus == 201500L || GLM_LANG_PLATFORM == 201402L +# define GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_EXT) +# elif __cplusplus == 201103L || GLM_LANG_PLATFORM == 201103L +# define GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_EXT) +# elif defined(__INTEL_CXX11_MODE__) || defined(_MSC_VER) || defined(__GXX_EXPERIMENTAL_CXX0X__) +# define GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_EXT) +# elif __cplusplus == 199711L +# define GLM_LANG (GLM_LANG_CXX98 | GLM_LANG_EXT) +# else +# define GLM_LANG (0 | GLM_LANG_EXT) +# endif +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Has of C++ features + +// http://clang.llvm.org/cxx_status.html +// http://gcc.gnu.org/projects/cxx0x.html +// http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.120).aspx + +// Android has multiple STLs but C++11 STL detection doesn't always work #284 #564 +#if GLM_PLATFORM == GLM_PLATFORM_ANDROID && !defined(GLM_LANG_STL11_FORCED) +# define GLM_HAS_CXX11_STL 0 +#elif GLM_COMPILER & GLM_COMPILER_CLANG +# if (defined(_LIBCPP_VERSION) || (GLM_LANG & GLM_LANG_CXX11_FLAG) || defined(GLM_LANG_STL11_FORCED)) +# define GLM_HAS_CXX11_STL 1 +# else +# define GLM_HAS_CXX11_STL 0 +# endif +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_CXX11_STL 1 +#else +# define GLM_HAS_CXX11_STL ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ + ((GLM_PLATFORM != GLM_PLATFORM_WINDOWS) && (GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15)))) +#endif + +// N1720 +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_STATIC_ASSERT __has_feature(cxx_static_assert) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_STATIC_ASSERT 1 +#else +# define GLM_HAS_STATIC_ASSERT ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC)))) +#endif + +// N1988 +#if GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_EXTENDED_INTEGER_TYPE 1 +#else +# define GLM_HAS_EXTENDED_INTEGER_TYPE (\ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC)) || \ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CUDA)) || \ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CLANG))) +#endif + +// N2672 Initializer lists http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_INITIALIZER_LISTS __has_feature(cxx_generalized_initializers) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_INITIALIZER_LISTS 1 +#else +# define GLM_HAS_INITIALIZER_LISTS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)) || \ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2544 Unrestricted unions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_UNRESTRICTED_UNIONS 1 +#else +# define GLM_HAS_UNRESTRICTED_UNIONS (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + (GLM_COMPILER & GLM_COMPILER_VC) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA))) +#endif + +// N2346 +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_DEFAULTED_FUNCTIONS __has_feature(cxx_defaulted_functions) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_DEFAULTED_FUNCTIONS 1 +#else +# define GLM_HAS_DEFAULTED_FUNCTIONS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ + (GLM_COMPILER & GLM_COMPILER_CUDA))) +#endif + +// N2118 +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_RVALUE_REFERENCES __has_feature(cxx_rvalue_references) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_RVALUE_REFERENCES 1 +#else +# define GLM_HAS_RVALUE_REFERENCES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2437 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS __has_feature(cxx_explicit_conversions) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS 1 +#else +# define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2258 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_TEMPLATE_ALIASES __has_feature(cxx_alias_templates) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_TEMPLATE_ALIASES 1 +#else +# define GLM_HAS_TEMPLATE_ALIASES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2930 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_RANGE_FOR __has_feature(cxx_range_for) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_RANGE_FOR 1 +#else +# define GLM_HAS_RANGE_FOR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2341 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_ALIGNOF __has_feature(cxx_alignas) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_ALIGNOF 1 +#else +# define GLM_HAS_ALIGNOF ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2235 Generalized Constant Expressions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf +// N3652 Extended Constant Expressions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3652.html +#if (GLM_ARCH & GLM_ARCH_SIMD_BIT) // Compiler SIMD intrinsics don't support constexpr... +# define GLM_HAS_CONSTEXPR 0 +#elif (GLM_COMPILER & GLM_COMPILER_CLANG) +# define GLM_HAS_CONSTEXPR __has_feature(cxx_relaxed_constexpr) +#elif (GLM_LANG & GLM_LANG_CXX14_FLAG) +# define GLM_HAS_CONSTEXPR 1 +#else +# define GLM_HAS_CONSTEXPR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && GLM_HAS_INITIALIZER_LISTS && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL17)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)))) +#endif + +#if GLM_HAS_CONSTEXPR +# define GLM_CONSTEXPR constexpr +#else +# define GLM_CONSTEXPR +#endif + +// +#if GLM_HAS_CONSTEXPR +# if (GLM_COMPILER & GLM_COMPILER_CLANG) +# if __has_feature(cxx_if_constexpr) +# define GLM_HAS_IF_CONSTEXPR 1 +# else +# define GLM_HAS_IF_CONSTEXPR 0 +# endif +# elif (GLM_LANG & GLM_LANG_CXX17_FLAG) +# define GLM_HAS_IF_CONSTEXPR 1 +# else +# define GLM_HAS_IF_CONSTEXPR 0 +# endif +#else +# define GLM_HAS_IF_CONSTEXPR 0 +#endif + +#if GLM_HAS_IF_CONSTEXPR +# define GLM_IF_CONSTEXPR if constexpr +#else +# define GLM_IF_CONSTEXPR if +#endif + +// +#if GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_ASSIGNABLE 1 +#else +# define GLM_HAS_ASSIGNABLE ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)) || \ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC49)))) +#endif + +// +#define GLM_HAS_TRIVIAL_QUERIES 0 + +// +#if GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_MAKE_SIGNED 1 +#else +# define GLM_HAS_MAKE_SIGNED ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// +#if defined(GLM_FORCE_INTRINSICS) +# define GLM_HAS_BITSCAN_WINDOWS ((GLM_PLATFORM & GLM_PLATFORM_WINDOWS) && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14) && (GLM_ARCH & GLM_ARCH_X86_BIT)))) +#else +# define GLM_HAS_BITSCAN_WINDOWS 0 +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// OpenMP +#ifdef _OPENMP +# if GLM_COMPILER & GLM_COMPILER_GCC +# if GLM_COMPILER >= GLM_COMPILER_GCC61 +# define GLM_HAS_OPENMP 45 +# elif GLM_COMPILER >= GLM_COMPILER_GCC49 +# define GLM_HAS_OPENMP 40 +# elif GLM_COMPILER >= GLM_COMPILER_GCC47 +# define GLM_HAS_OPENMP 31 +# else +# define GLM_HAS_OPENMP 0 +# endif +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# if GLM_COMPILER >= GLM_COMPILER_CLANG38 +# define GLM_HAS_OPENMP 31 +# else +# define GLM_HAS_OPENMP 0 +# endif +# elif GLM_COMPILER & GLM_COMPILER_VC +# define GLM_HAS_OPENMP 20 +# elif GLM_COMPILER & GLM_COMPILER_INTEL +# if GLM_COMPILER >= GLM_COMPILER_INTEL16 +# define GLM_HAS_OPENMP 40 +# else +# define GLM_HAS_OPENMP 0 +# endif +# else +# define GLM_HAS_OPENMP 0 +# endif +#else +# define GLM_HAS_OPENMP 0 +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// nullptr + +#if GLM_LANG & GLM_LANG_CXX0X_FLAG +# define GLM_CONFIG_NULLPTR GLM_ENABLE +#else +# define GLM_CONFIG_NULLPTR GLM_DISABLE +#endif + +#if GLM_CONFIG_NULLPTR == GLM_ENABLE +# define GLM_NULLPTR nullptr +#else +# define GLM_NULLPTR 0 +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Static assert + +#if GLM_HAS_STATIC_ASSERT +# define GLM_STATIC_ASSERT(x, message) static_assert(x, message) +#elif GLM_COMPILER & GLM_COMPILER_VC +# define GLM_STATIC_ASSERT(x, message) typedef char __CASSERT__##__LINE__[(x) ? 1 : -1] +#else +# define GLM_STATIC_ASSERT(x, message) assert(x) +#endif//GLM_LANG + +/////////////////////////////////////////////////////////////////////////////////// +// Qualifiers + +#if GLM_COMPILER & GLM_COMPILER_CUDA +# define GLM_CUDA_FUNC_DEF __device__ __host__ +# define GLM_CUDA_FUNC_DECL __device__ __host__ +#else +# define GLM_CUDA_FUNC_DEF +# define GLM_CUDA_FUNC_DECL +#endif + +#if defined(GLM_FORCE_INLINE) +# if GLM_COMPILER & GLM_COMPILER_VC +# define GLM_INLINE __forceinline +# define GLM_NEVER_INLINE __declspec((noinline)) +# elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG) +# define GLM_INLINE inline __attribute__((__always_inline__)) +# define GLM_NEVER_INLINE __attribute__((__noinline__)) +# elif GLM_COMPILER & GLM_COMPILER_CUDA +# define GLM_INLINE __forceinline__ +# define GLM_NEVER_INLINE __noinline__ +# else +# define GLM_INLINE inline +# define GLM_NEVER_INLINE +# endif//GLM_COMPILER +#else +# define GLM_INLINE inline +# define GLM_NEVER_INLINE +#endif//defined(GLM_FORCE_INLINE) + +#define GLM_FUNC_DECL GLM_CUDA_FUNC_DECL +#define GLM_FUNC_QUALIFIER GLM_CUDA_FUNC_DEF GLM_INLINE + +/////////////////////////////////////////////////////////////////////////////////// +// Swizzle operators + +// User defines: GLM_FORCE_SWIZZLE + +#define GLM_SWIZZLE_DISABLED 0 +#define GLM_SWIZZLE_OPERATOR 1 +#define GLM_SWIZZLE_FUNCTION 2 + +#if defined(GLM_FORCE_XYZW_ONLY) +# undef GLM_FORCE_SWIZZLE +#endif + +#if defined(GLM_SWIZZLE) +# pragma message("GLM: GLM_SWIZZLE is deprecated, use GLM_FORCE_SWIZZLE instead.") +# define GLM_FORCE_SWIZZLE +#endif + +#if defined(GLM_FORCE_SWIZZLE) && (GLM_LANG & GLM_LANG_CXXMS_FLAG) +# define GLM_CONFIG_SWIZZLE GLM_SWIZZLE_OPERATOR +#elif defined(GLM_FORCE_SWIZZLE) +# define GLM_CONFIG_SWIZZLE GLM_SWIZZLE_FUNCTION +#else +# define GLM_CONFIG_SWIZZLE GLM_SWIZZLE_DISABLED +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Allows using not basic types as genType + +// #define GLM_FORCE_UNRESTRICTED_GENTYPE + +#ifdef GLM_FORCE_UNRESTRICTED_GENTYPE +# define GLM_CONFIG_UNRESTRICTED_GENTYPE GLM_ENABLE +#else +# define GLM_CONFIG_UNRESTRICTED_GENTYPE GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Clip control, define GLM_FORCE_DEPTH_ZERO_TO_ONE before including GLM +// to use a clip space between 0 to 1. +// Coordinate system, define GLM_FORCE_LEFT_HANDED before including GLM +// to use left handed coordinate system by default. + +#define GLM_CLIP_CONTROL_ZO_BIT (1 << 0) // ZERO_TO_ONE +#define GLM_CLIP_CONTROL_NO_BIT (1 << 1) // NEGATIVE_ONE_TO_ONE +#define GLM_CLIP_CONTROL_LH_BIT (1 << 2) // LEFT_HANDED, For DirectX, Metal, Vulkan +#define GLM_CLIP_CONTROL_RH_BIT (1 << 3) // RIGHT_HANDED, For OpenGL, default in GLM + +#define GLM_CLIP_CONTROL_LH_ZO (GLM_CLIP_CONTROL_LH_BIT | GLM_CLIP_CONTROL_ZO_BIT) +#define GLM_CLIP_CONTROL_LH_NO (GLM_CLIP_CONTROL_LH_BIT | GLM_CLIP_CONTROL_NO_BIT) +#define GLM_CLIP_CONTROL_RH_ZO (GLM_CLIP_CONTROL_RH_BIT | GLM_CLIP_CONTROL_ZO_BIT) +#define GLM_CLIP_CONTROL_RH_NO (GLM_CLIP_CONTROL_RH_BIT | GLM_CLIP_CONTROL_NO_BIT) + +#ifdef GLM_FORCE_DEPTH_ZERO_TO_ONE +# ifdef GLM_FORCE_LEFT_HANDED +# define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_LH_ZO +# else +# define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_RH_ZO +# endif +#else +# ifdef GLM_FORCE_LEFT_HANDED +# define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_LH_NO +# else +# define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_RH_NO +# endif +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Qualifiers + +#if (GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)) +# define GLM_DEPRECATED __declspec(deprecated) +# define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef __declspec(align(alignment)) type name +#elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG | GLM_COMPILER_INTEL) +# define GLM_DEPRECATED __attribute__((__deprecated__)) +# define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __attribute__((aligned(alignment))) +#elif GLM_COMPILER & GLM_COMPILER_CUDA +# define GLM_DEPRECATED +# define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __align__(x) +#else +# define GLM_DEPRECATED +# define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name +#endif + +/////////////////////////////////////////////////////////////////////////////////// + +#ifdef GLM_FORCE_EXPLICIT_CTOR +# define GLM_EXPLICIT explicit +#else +# define GLM_EXPLICIT +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// SYCL + +#if GLM_COMPILER==GLM_COMPILER_SYCL + +#include +#include + +namespace glm { +namespace std { + // Import SYCL's functions into the namespace glm::std to force their usages. + // It's important to use the math built-in function (sin, exp, ...) + // of SYCL instead the std ones. + using namespace cl::sycl; + + /////////////////////////////////////////////////////////////////////////////// + // Import some "harmless" std's stuffs used by glm into + // the new glm::std namespace. + template + using numeric_limits = ::std::numeric_limits; + + using ::std::size_t; + + using ::std::uint8_t; + using ::std::uint16_t; + using ::std::uint32_t; + using ::std::uint64_t; + + using ::std::int8_t; + using ::std::int16_t; + using ::std::int32_t; + using ::std::int64_t; + + using ::std::make_unsigned; + /////////////////////////////////////////////////////////////////////////////// +} //namespace std +} //namespace glm + +#endif + +/////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////// +// Length type: all length functions returns a length_t type. +// When GLM_FORCE_SIZE_T_LENGTH is defined, length_t is a typedef of size_t otherwise +// length_t is a typedef of int like GLSL defines it. + +#define GLM_LENGTH_INT 1 +#define GLM_LENGTH_SIZE_T 2 + +#ifdef GLM_FORCE_SIZE_T_LENGTH +# define GLM_CONFIG_LENGTH_TYPE GLM_LENGTH_SIZE_T +#else +# define GLM_CONFIG_LENGTH_TYPE GLM_LENGTH_INT +#endif + +namespace glm +{ + using std::size_t; +# if GLM_CONFIG_LENGTH_TYPE == GLM_LENGTH_SIZE_T + typedef size_t length_t; +# else + typedef int length_t; +# endif +}//namespace glm + +/////////////////////////////////////////////////////////////////////////////////// +// constexpr + +#if GLM_HAS_CONSTEXPR +# define GLM_CONFIG_CONSTEXP GLM_ENABLE + + namespace glm + { + template + constexpr std::size_t countof(T const (&)[N]) + { + return N; + } + }//namespace glm +# define GLM_COUNTOF(arr) glm::countof(arr) +#elif defined(_MSC_VER) +# define GLM_CONFIG_CONSTEXP GLM_DISABLE + +# define GLM_COUNTOF(arr) _countof(arr) +#else +# define GLM_CONFIG_CONSTEXP GLM_DISABLE + +# define GLM_COUNTOF(arr) sizeof(arr) / sizeof(arr[0]) +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// uint + +namespace glm{ +namespace detail +{ + template + struct is_int + { + enum test {value = 0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; +}//namespace detail + + typedef unsigned int uint; +}//namespace glm + +/////////////////////////////////////////////////////////////////////////////////// +// 64-bit int + +#if GLM_HAS_EXTENDED_INTEGER_TYPE +# include +#endif + +namespace glm{ +namespace detail +{ +# if GLM_HAS_EXTENDED_INTEGER_TYPE + typedef std::uint64_t uint64; + typedef std::int64_t int64; +# elif (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available + typedef uint64_t uint64; + typedef int64_t int64; +# elif GLM_COMPILER & GLM_COMPILER_VC + typedef unsigned __int64 uint64; + typedef signed __int64 int64; +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic ignored "-Wlong-long" + __extension__ typedef unsigned long long uint64; + __extension__ typedef signed long long int64; +# elif (GLM_COMPILER & GLM_COMPILER_CLANG) +# pragma clang diagnostic ignored "-Wc++11-long-long" + typedef unsigned long long uint64; + typedef signed long long int64; +# else//unknown compiler + typedef unsigned long long uint64; + typedef signed long long int64; +# endif +}//namespace detail +}//namespace glm + +/////////////////////////////////////////////////////////////////////////////////// +// make_unsigned + +#if GLM_HAS_MAKE_SIGNED +# include + +namespace glm{ +namespace detail +{ + using std::make_unsigned; +}//namespace detail +}//namespace glm + +#else + +namespace glm{ +namespace detail +{ + template + struct make_unsigned + {}; + + template<> + struct make_unsigned + { + typedef unsigned char type; + }; + + template<> + struct make_unsigned + { + typedef unsigned char type; + }; + + template<> + struct make_unsigned + { + typedef unsigned short type; + }; + + template<> + struct make_unsigned + { + typedef unsigned int type; + }; + + template<> + struct make_unsigned + { + typedef unsigned long type; + }; + + template<> + struct make_unsigned + { + typedef uint64 type; + }; + + template<> + struct make_unsigned + { + typedef unsigned char type; + }; + + template<> + struct make_unsigned + { + typedef unsigned short type; + }; + + template<> + struct make_unsigned + { + typedef unsigned int type; + }; + + template<> + struct make_unsigned + { + typedef unsigned long type; + }; + + template<> + struct make_unsigned + { + typedef uint64 type; + }; +}//namespace detail +}//namespace glm +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Only use x, y, z, w as vector type components + +#ifdef GLM_FORCE_XYZW_ONLY +# define GLM_CONFIG_XYZW_ONLY GLM_ENABLE +#else +# define GLM_CONFIG_XYZW_ONLY GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Configure the use of defaulted initialized types + +#define GLM_CTOR_INIT_DISABLE 0 +#define GLM_CTOR_INITIALIZER_LIST 1 +#define GLM_CTOR_INITIALISATION 2 + +#if defined(GLM_FORCE_CTOR_INIT) && GLM_HAS_INITIALIZER_LISTS +# define GLM_CONFIG_CTOR_INIT GLM_CTOR_INITIALIZER_LIST +#elif defined(GLM_FORCE_CTOR_INIT) && !GLM_HAS_INITIALIZER_LISTS +# define GLM_CONFIG_CTOR_INIT GLM_CTOR_INITIALISATION +#else +# define GLM_CONFIG_CTOR_INIT GLM_CTOR_INIT_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Use SIMD instruction sets + +#if GLM_HAS_ALIGNOF && (GLM_LANG & GLM_LANG_CXXMS_FLAG) && (GLM_ARCH & GLM_ARCH_SIMD_BIT) +# define GLM_CONFIG_SIMD GLM_ENABLE +#else +# define GLM_CONFIG_SIMD GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Configure the use of defaulted function + +#if GLM_HAS_DEFAULTED_FUNCTIONS && GLM_CONFIG_CTOR_INIT == GLM_CTOR_INIT_DISABLE +# define GLM_CONFIG_DEFAULTED_FUNCTIONS GLM_ENABLE +# define GLM_DEFAULT = default +#else +# define GLM_CONFIG_DEFAULTED_FUNCTIONS GLM_DISABLE +# define GLM_DEFAULT +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Configure the use of aligned gentypes + +#ifdef GLM_FORCE_ALIGNED // Legacy define +# define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES +#endif + +#ifdef GLM_FORCE_DEFAULT_ALIGNED_GENTYPES +# define GLM_FORCE_ALIGNED_GENTYPES +#endif + +#if GLM_HAS_ALIGNOF && (GLM_LANG & GLM_LANG_CXXMS_FLAG) && (defined(GLM_FORCE_ALIGNED_GENTYPES) || (GLM_CONFIG_SIMD == GLM_ENABLE)) +# define GLM_CONFIG_ALIGNED_GENTYPES GLM_ENABLE +#else +# define GLM_CONFIG_ALIGNED_GENTYPES GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Configure the use of anonymous structure as implementation detail + +#if ((GLM_CONFIG_SIMD == GLM_ENABLE) || (GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR) || (GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE)) +# define GLM_CONFIG_ANONYMOUS_STRUCT GLM_ENABLE +#else +# define GLM_CONFIG_ANONYMOUS_STRUCT GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Silent warnings + +#ifdef GLM_FORCE_SILENT_WARNINGS +# define GLM_SILENT_WARNINGS GLM_ENABLE +#else +# define GLM_SILENT_WARNINGS GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Precision + +#define GLM_HIGHP 1 +#define GLM_MEDIUMP 2 +#define GLM_LOWP 3 + +#if defined(GLM_FORCE_PRECISION_HIGHP_BOOL) || defined(GLM_PRECISION_HIGHP_BOOL) +# define GLM_CONFIG_PRECISION_BOOL GLM_HIGHP +#elif defined(GLM_FORCE_PRECISION_MEDIUMP_BOOL) || defined(GLM_PRECISION_MEDIUMP_BOOL) +# define GLM_CONFIG_PRECISION_BOOL GLM_MEDIUMP +#elif defined(GLM_FORCE_PRECISION_LOWP_BOOL) || defined(GLM_PRECISION_LOWP_BOOL) +# define GLM_CONFIG_PRECISION_BOOL GLM_LOWP +#else +# define GLM_CONFIG_PRECISION_BOOL GLM_HIGHP +#endif + +#if defined(GLM_FORCE_PRECISION_HIGHP_INT) || defined(GLM_PRECISION_HIGHP_INT) +# define GLM_CONFIG_PRECISION_INT GLM_HIGHP +#elif defined(GLM_FORCE_PRECISION_MEDIUMP_INT) || defined(GLM_PRECISION_MEDIUMP_INT) +# define GLM_CONFIG_PRECISION_INT GLM_MEDIUMP +#elif defined(GLM_FORCE_PRECISION_LOWP_INT) || defined(GLM_PRECISION_LOWP_INT) +# define GLM_CONFIG_PRECISION_INT GLM_LOWP +#else +# define GLM_CONFIG_PRECISION_INT GLM_HIGHP +#endif + +#if defined(GLM_FORCE_PRECISION_HIGHP_UINT) || defined(GLM_PRECISION_HIGHP_UINT) +# define GLM_CONFIG_PRECISION_UINT GLM_HIGHP +#elif defined(GLM_FORCE_PRECISION_MEDIUMP_UINT) || defined(GLM_PRECISION_MEDIUMP_UINT) +# define GLM_CONFIG_PRECISION_UINT GLM_MEDIUMP +#elif defined(GLM_FORCE_PRECISION_LOWP_UINT) || defined(GLM_PRECISION_LOWP_UINT) +# define GLM_CONFIG_PRECISION_UINT GLM_LOWP +#else +# define GLM_CONFIG_PRECISION_UINT GLM_HIGHP +#endif + +#if defined(GLM_FORCE_PRECISION_HIGHP_FLOAT) || defined(GLM_PRECISION_HIGHP_FLOAT) +# define GLM_CONFIG_PRECISION_FLOAT GLM_HIGHP +#elif defined(GLM_FORCE_PRECISION_MEDIUMP_FLOAT) || defined(GLM_PRECISION_MEDIUMP_FLOAT) +# define GLM_CONFIG_PRECISION_FLOAT GLM_MEDIUMP +#elif defined(GLM_FORCE_PRECISION_LOWP_FLOAT) || defined(GLM_PRECISION_LOWP_FLOAT) +# define GLM_CONFIG_PRECISION_FLOAT GLM_LOWP +#else +# define GLM_CONFIG_PRECISION_FLOAT GLM_HIGHP +#endif + +#if defined(GLM_FORCE_PRECISION_HIGHP_DOUBLE) || defined(GLM_PRECISION_HIGHP_DOUBLE) +# define GLM_CONFIG_PRECISION_DOUBLE GLM_HIGHP +#elif defined(GLM_FORCE_PRECISION_MEDIUMP_DOUBLE) || defined(GLM_PRECISION_MEDIUMP_DOUBLE) +# define GLM_CONFIG_PRECISION_DOUBLE GLM_MEDIUMP +#elif defined(GLM_FORCE_PRECISION_LOWP_DOUBLE) || defined(GLM_PRECISION_LOWP_DOUBLE) +# define GLM_CONFIG_PRECISION_DOUBLE GLM_LOWP +#else +# define GLM_CONFIG_PRECISION_DOUBLE GLM_HIGHP +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Check inclusions of different versions of GLM + +#elif ((GLM_SETUP_INCLUDED != GLM_VERSION) && !defined(GLM_FORCE_IGNORE_VERSION)) +# error "GLM error: A different version of GLM is already included. Define GLM_FORCE_IGNORE_VERSION before including GLM headers to ignore this error." +#elif GLM_SETUP_INCLUDED == GLM_VERSION + +/////////////////////////////////////////////////////////////////////////////////// +// Messages + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_MESSAGE_DISPLAYED) +# define GLM_MESSAGE_DISPLAYED +# define GLM_STR_HELPER(x) #x +# define GLM_STR(x) GLM_STR_HELPER(x) + + // Report GLM version +# pragma message (GLM_STR(GLM_VERSION_MESSAGE)) + + // Report C++ language +# if (GLM_LANG & GLM_LANG_CXX2A_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 2A with extensions") +# elif (GLM_LANG & GLM_LANG_CXX2A_FLAG) +# pragma message("GLM: C++ 2A") +# elif (GLM_LANG & GLM_LANG_CXX17_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 17 with extensions") +# elif (GLM_LANG & GLM_LANG_CXX17_FLAG) +# pragma message("GLM: C++ 17") +# elif (GLM_LANG & GLM_LANG_CXX14_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 14 with extensions") +# elif (GLM_LANG & GLM_LANG_CXX14_FLAG) +# pragma message("GLM: C++ 14") +# elif (GLM_LANG & GLM_LANG_CXX11_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 11 with extensions") +# elif (GLM_LANG & GLM_LANG_CXX11_FLAG) +# pragma message("GLM: C++ 11") +# elif (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 0x with extensions") +# elif (GLM_LANG & GLM_LANG_CXX0X_FLAG) +# pragma message("GLM: C++ 0x") +# elif (GLM_LANG & GLM_LANG_CXX03_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 03 with extensions") +# elif (GLM_LANG & GLM_LANG_CXX03_FLAG) +# pragma message("GLM: C++ 03") +# elif (GLM_LANG & GLM_LANG_CXX98_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 98 with extensions") +# elif (GLM_LANG & GLM_LANG_CXX98_FLAG) +# pragma message("GLM: C++ 98") +# else +# pragma message("GLM: C++ language undetected") +# endif//GLM_LANG + + // Report compiler detection +# if GLM_COMPILER & GLM_COMPILER_CUDA +# pragma message("GLM: CUDA compiler detected") +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma message("GLM: Visual C++ compiler detected") +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma message("GLM: Clang compiler detected") +# elif GLM_COMPILER & GLM_COMPILER_INTEL +# pragma message("GLM: Intel Compiler detected") +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma message("GLM: GCC compiler detected") +# else +# pragma message("GLM: Compiler not detected") +# endif + + // Report build target +# if (GLM_ARCH & GLM_ARCH_AVX2_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with AVX2 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_AVX2_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with AVX2 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_AVX_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with AVX instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_AVX_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with AVX instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_SSE42_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with SSE4.2 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_SSE42_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with SSE4.2 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_SSE41_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with SSE4.1 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_SSE41_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with SSE4.1 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_SSSE3_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with SSSE3 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_SSSE3_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with SSSE3 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_SSE3_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with SSE3 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_SSE3_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with SSE3 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_SSE2_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with SSE2 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_SSE2_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with SSE2 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_X86_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits build target") +# elif (GLM_ARCH & GLM_ARCH_X86_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits build target") + +# elif (GLM_ARCH & GLM_ARCH_NEON_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: ARM 64 bits with Neon instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_NEON_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: ARM 32 bits with Neon instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_ARM_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: ARM 64 bits build target") +# elif (GLM_ARCH & GLM_ARCH_ARM_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: ARM 32 bits build target") + +# elif (GLM_ARCH & GLM_ARCH_MIPS_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: MIPS 64 bits build target") +# elif (GLM_ARCH & GLM_ARCH_MIPS_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: MIPS 32 bits build target") + +# elif (GLM_ARCH & GLM_ARCH_PPC_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: PowerPC 64 bits build target") +# elif (GLM_ARCH & GLM_ARCH_PPC_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: PowerPC 32 bits build target") +# else +# pragma message("GLM: Unknown build target") +# endif//GLM_ARCH + + // Report platform name +# if(GLM_PLATFORM & GLM_PLATFORM_QNXNTO) +# pragma message("GLM: QNX platform detected") +//# elif(GLM_PLATFORM & GLM_PLATFORM_IOS) +//# pragma message("GLM: iOS platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_APPLE) +# pragma message("GLM: Apple platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_WINCE) +# pragma message("GLM: WinCE platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_WINDOWS) +# pragma message("GLM: Windows platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_CHROME_NACL) +# pragma message("GLM: Native Client detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) +# pragma message("GLM: Android platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_LINUX) +# pragma message("GLM: Linux platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_UNIX) +# pragma message("GLM: UNIX platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_UNKNOWN) +# pragma message("GLM: platform unknown") +# else +# pragma message("GLM: platform not detected") +# endif + + // Report whether only xyzw component are used +# if defined GLM_FORCE_XYZW_ONLY +# pragma message("GLM: GLM_FORCE_XYZW_ONLY is defined. Only x, y, z and w component are available in vector type. This define disables swizzle operators and SIMD instruction sets.") +# endif + + // Report swizzle operator support +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +# pragma message("GLM: GLM_FORCE_SWIZZLE is defined, swizzling operators enabled.") +# elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION +# pragma message("GLM: GLM_FORCE_SWIZZLE is defined, swizzling functions enabled. Enable compiler C++ language extensions to enable swizzle operators.") +# else +# pragma message("GLM: GLM_FORCE_SWIZZLE is undefined. swizzling functions or operators are disabled.") +# endif + + // Report .length() type +# if GLM_CONFIG_LENGTH_TYPE == GLM_LENGTH_SIZE_T +# pragma message("GLM: GLM_FORCE_SIZE_T_LENGTH is defined. .length() returns a glm::length_t, a typedef of std::size_t.") +# else +# pragma message("GLM: GLM_FORCE_SIZE_T_LENGTH is undefined. .length() returns a glm::length_t, a typedef of int following GLSL.") +# endif + +# if GLM_CONFIG_UNRESTRICTED_GENTYPE == GLM_ENABLE +# pragma message("GLM: GLM_FORCE_UNRESTRICTED_GENTYPE is defined. Removes GLSL restrictions on valid function genTypes.") +# else +# pragma message("GLM: GLM_FORCE_UNRESTRICTED_GENTYPE is undefined. Follows strictly GLSL on valid function genTypes.") +# endif + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# pragma message("GLM: GLM_FORCE_SILENT_WARNINGS is defined. Ignores C++ warnings from using C++ language extensions.") +# else +# pragma message("GLM: GLM_FORCE_SILENT_WARNINGS is undefined. Shows C++ warnings from using C++ language extensions.") +# endif + +# ifdef GLM_FORCE_SINGLE_ONLY +# pragma message("GLM: GLM_FORCE_SINGLE_ONLY is defined. Using only single precision floating-point types.") +# endif + +# if defined(GLM_FORCE_ALIGNED_GENTYPES) && (GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE) +# undef GLM_FORCE_ALIGNED_GENTYPES +# pragma message("GLM: GLM_FORCE_ALIGNED_GENTYPES is defined, allowing aligned types. This prevents the use of C++ constexpr.") +# elif defined(GLM_FORCE_ALIGNED_GENTYPES) && (GLM_CONFIG_ALIGNED_GENTYPES == GLM_DISABLE) +# undef GLM_FORCE_ALIGNED_GENTYPES +# pragma message("GLM: GLM_FORCE_ALIGNED_GENTYPES is defined but is disabled. It requires C++11 and language extensions.") +# endif + +# if defined(GLM_FORCE_DEFAULT_ALIGNED_GENTYPES) +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_DISABLE +# undef GLM_FORCE_DEFAULT_ALIGNED_GENTYPES +# pragma message("GLM: GLM_FORCE_DEFAULT_ALIGNED_GENTYPES is defined but is disabled. It requires C++11 and language extensions.") +# elif GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE +# pragma message("GLM: GLM_FORCE_DEFAULT_ALIGNED_GENTYPES is defined. All gentypes (e.g. vec3) will be aligned and padded by default.") +# endif +# endif + +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT +# pragma message("GLM: GLM_FORCE_DEPTH_ZERO_TO_ONE is defined. Using zero to one depth clip space.") +# else +# pragma message("GLM: GLM_FORCE_DEPTH_ZERO_TO_ONE is undefined. Using negative one to one depth clip space.") +# endif + +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT +# pragma message("GLM: GLM_FORCE_LEFT_HANDED is defined. Using left handed coordinate system.") +# else +# pragma message("GLM: GLM_FORCE_LEFT_HANDED is undefined. Using right handed coordinate system.") +# endif +#endif//GLM_MESSAGES + +#endif//GLM_SETUP_INCLUDED diff --git a/NothinFancy/dep/include/glm/detail/type_float.hpp b/NothinFancy/dep/include/glm/detail/type_float.hpp new file mode 100644 index 0000000..c8037eb --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_float.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include "setup.hpp" + +#if GLM_COMPILER == GLM_COMPILER_VC12 +# pragma warning(push) +# pragma warning(disable: 4512) // assignment operator could not be generated +#endif + +namespace glm{ +namespace detail +{ + template + union float_t + {}; + + // https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ + template <> + union float_t + { + typedef int int_type; + typedef float float_type; + + GLM_CONSTEXPR float_t(float_type Num = 0.0f) : f(Num) {} + + GLM_CONSTEXPR float_t& operator=(float_t const& x) + { + f = x.f; + return *this; + } + + // Portable extraction of components. + GLM_CONSTEXPR bool negative() const { return i < 0; } + GLM_CONSTEXPR int_type mantissa() const { return i & ((1 << 23) - 1); } + GLM_CONSTEXPR int_type exponent() const { return (i >> 23) & ((1 << 8) - 1); } + + int_type i; + float_type f; + }; + + template <> + union float_t + { + typedef detail::int64 int_type; + typedef double float_type; + + GLM_CONSTEXPR float_t(float_type Num = static_cast(0)) : f(Num) {} + + GLM_CONSTEXPR float_t& operator=(float_t const& x) + { + f = x.f; + return *this; + } + + // Portable extraction of components. + GLM_CONSTEXPR bool negative() const { return i < 0; } + GLM_CONSTEXPR int_type mantissa() const { return i & ((int_type(1) << 52) - 1); } + GLM_CONSTEXPR int_type exponent() const { return (i >> 52) & ((int_type(1) << 11) - 1); } + + int_type i; + float_type f; + }; +}//namespace detail +}//namespace glm + +#if GLM_COMPILER == GLM_COMPILER_VC12 +# pragma warning(pop) +#endif diff --git a/NothinFancy/dep/include/glm/detail/type_half.hpp b/NothinFancy/dep/include/glm/detail/type_half.hpp new file mode 100644 index 0000000..40b8bec --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_half.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "setup.hpp" + +namespace glm{ +namespace detail +{ + typedef short hdata; + + GLM_FUNC_DECL float toFloat32(hdata value); + GLM_FUNC_DECL hdata toFloat16(float const& value); + +}//namespace detail +}//namespace glm + +#include "type_half.inl" diff --git a/NothinFancy/dep/include/glm/detail/type_half.inl b/NothinFancy/dep/include/glm/detail/type_half.inl new file mode 100644 index 0000000..b0723e3 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_half.inl @@ -0,0 +1,241 @@ +namespace glm{ +namespace detail +{ + GLM_FUNC_QUALIFIER float overflow() + { + volatile float f = 1e10; + + for(int i = 0; i < 10; ++i) + f *= f; // this will overflow before the for loop terminates + return f; + } + + union uif32 + { + GLM_FUNC_QUALIFIER uif32() : + i(0) + {} + + GLM_FUNC_QUALIFIER uif32(float f_) : + f(f_) + {} + + GLM_FUNC_QUALIFIER uif32(unsigned int i_) : + i(i_) + {} + + float f; + unsigned int i; + }; + + GLM_FUNC_QUALIFIER float toFloat32(hdata value) + { + int s = (value >> 15) & 0x00000001; + int e = (value >> 10) & 0x0000001f; + int m = value & 0x000003ff; + + if(e == 0) + { + if(m == 0) + { + // + // Plus or minus zero + // + + detail::uif32 result; + result.i = static_cast(s << 31); + return result.f; + } + else + { + // + // Denormalized number -- renormalize it + // + + while(!(m & 0x00000400)) + { + m <<= 1; + e -= 1; + } + + e += 1; + m &= ~0x00000400; + } + } + else if(e == 31) + { + if(m == 0) + { + // + // Positive or negative infinity + // + + uif32 result; + result.i = static_cast((s << 31) | 0x7f800000); + return result.f; + } + else + { + // + // Nan -- preserve sign and significand bits + // + + uif32 result; + result.i = static_cast((s << 31) | 0x7f800000 | (m << 13)); + return result.f; + } + } + + // + // Normalized number + // + + e = e + (127 - 15); + m = m << 13; + + // + // Assemble s, e and m. + // + + uif32 Result; + Result.i = static_cast((s << 31) | (e << 23) | m); + return Result.f; + } + + GLM_FUNC_QUALIFIER hdata toFloat16(float const& f) + { + uif32 Entry; + Entry.f = f; + int i = static_cast(Entry.i); + + // + // Our floating point number, f, is represented by the bit + // pattern in integer i. Disassemble that bit pattern into + // the sign, s, the exponent, e, and the significand, m. + // Shift s into the position where it will go in the + // resulting half number. + // Adjust e, accounting for the different exponent bias + // of float and half (127 versus 15). + // + + int s = (i >> 16) & 0x00008000; + int e = ((i >> 23) & 0x000000ff) - (127 - 15); + int m = i & 0x007fffff; + + // + // Now reassemble s, e and m into a half: + // + + if(e <= 0) + { + if(e < -10) + { + // + // E is less than -10. The absolute value of f is + // less than half_MIN (f may be a small normalized + // float, a denormalized float or a zero). + // + // We convert f to a half zero. + // + + return hdata(s); + } + + // + // E is between -10 and 0. F is a normalized float, + // whose magnitude is less than __half_NRM_MIN. + // + // We convert f to a denormalized half. + // + + m = (m | 0x00800000) >> (1 - e); + + // + // Round to nearest, round "0.5" up. + // + // Rounding may cause the significand to overflow and make + // our number normalized. Because of the way a half's bits + // are laid out, we don't have to treat this case separately; + // the code below will handle it correctly. + // + + if(m & 0x00001000) + m += 0x00002000; + + // + // Assemble the half from s, e (zero) and m. + // + + return hdata(s | (m >> 13)); + } + else if(e == 0xff - (127 - 15)) + { + if(m == 0) + { + // + // F is an infinity; convert f to a half + // infinity with the same sign as f. + // + + return hdata(s | 0x7c00); + } + else + { + // + // F is a NAN; we produce a half NAN that preserves + // the sign bit and the 10 leftmost bits of the + // significand of f, with one exception: If the 10 + // leftmost bits are all zero, the NAN would turn + // into an infinity, so we have to set at least one + // bit in the significand. + // + + m >>= 13; + + return hdata(s | 0x7c00 | m | (m == 0)); + } + } + else + { + // + // E is greater than zero. F is a normalized float. + // We try to convert f to a normalized half. + // + + // + // Round to nearest, round "0.5" up + // + + if(m & 0x00001000) + { + m += 0x00002000; + + if(m & 0x00800000) + { + m = 0; // overflow in significand, + e += 1; // adjust exponent + } + } + + // + // Handle exponent overflow + // + + if (e > 30) + { + overflow(); // Cause a hardware floating point overflow; + + return hdata(s | 0x7c00); + // if this returns, the half becomes an + } // infinity with the same sign as f. + + // + // Assemble the half from s, e and m. + // + + return hdata(s | (e << 10) | (m >> 13)); + } + } + +}//namespace detail +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_mat2x2.hpp b/NothinFancy/dep/include/glm/detail/type_mat2x2.hpp new file mode 100644 index 0000000..033908f --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat2x2.hpp @@ -0,0 +1,177 @@ +/// @ref core +/// @file glm/detail/type_mat2x2.hpp + +#pragma once + +#include "type_vec2.hpp" +#include +#include + +namespace glm +{ + template + struct mat<2, 2, T, Q> + { + typedef vec<2, T, Q> col_type; + typedef vec<2, T, Q> row_type; + typedef mat<2, 2, T, Q> type; + typedef mat<2, 2, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[2]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<2, 2, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T const& x1, T const& y1, + T const& x2, T const& y2); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v1, + col_type const& v2); + + // -- Conversions -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + U const& x1, V const& y1, + M const& x2, N const& y2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<2, U, Q> const& v1, + vec<2, V, Q> const& v2); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator=(mat<2, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator+=(mat<2, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator-=(mat<2, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator*=(mat<2, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator/=(U s); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator/=(mat<2, 2, U, Q> const& m); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<2, 2, T, Q> & operator++ (); + GLM_FUNC_DECL mat<2, 2, T, Q> & operator-- (); + GLM_FUNC_DECL mat<2, 2, T, Q> operator++(int); + GLM_FUNC_DECL mat<2, 2, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(T scalar, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(T scalar, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(T scalar, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<2, 2, T, Q>::col_type operator*(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<2, 2, T, Q>::row_type operator*(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator/(T scalar, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<2, 2, T, Q>::col_type operator/(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<2, 2, T, Q>::row_type operator/(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); +} //namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat2x2.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/type_mat2x2.inl b/NothinFancy/dep/include/glm/detail/type_mat2x2.inl new file mode 100644 index 0000000..fe5d1aa --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat2x2.inl @@ -0,0 +1,536 @@ +#include "../matrix.hpp" + +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0), col_type(0, 1)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0); + this->value[1] = col_type(0, 1); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 2, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{m[0], m[1]} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(T scalar) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(scalar, 0), col_type(0, scalar)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(scalar, 0); + this->value[1] = col_type(0, scalar); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat + ( + T const& x0, T const& y0, + T const& x1, T const& y1 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0), col_type(x1, y1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(col_type const& v0, col_type const& v1) +# if GLM_HAS_INITIALIZER_LISTS + : value{v0, v1} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; +# endif + } + + // -- Conversion constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat + ( + X1 const& x1, Y1 const& y1, + X2 const& x2, Y2 const& y2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(static_cast(x1), value_type(y1)), col_type(static_cast(x2), value_type(y2)) } +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(static_cast(x1), value_type(y1)); + this->value[1] = col_type(static_cast(x2), value_type(y2)); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(vec<2, V1, Q> const& v1, vec<2, V2, Q> const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); +# endif + } + + // -- mat2x2 matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 2, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 2, T, Q>::col_type const& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator=(mat<2, 2, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(U scalar) + { + this->value[0] += scalar; + this->value[1] += scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(mat<2, 2, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(U scalar) + { + this->value[0] -= scalar; + this->value[1] -= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(mat<2, 2, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(U scalar) + { + this->value[0] *= scalar; + this->value[1] *= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(mat<2, 2, U, Q> const& m) + { + return (*this = *this * m); + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(U scalar) + { + this->value[0] /= scalar; + this->value[1] /= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(mat<2, 2, U, Q> const& m) + { + return *this *= inverse(m); + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> mat<2, 2, T, Q>::operator++(int) + { + mat<2, 2, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> mat<2, 2, T, Q>::operator--(int) + { + mat<2, 2, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + -m[0], + -m[1]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m, T scalar) + { + return mat<2, 2, T, Q>( + m[0] + scalar, + m[1] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(T scalar, mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + m[0] + scalar, + m[1] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return mat<2, 2, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m, T scalar) + { + return mat<2, 2, T, Q>( + m[0] - scalar, + m[1] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(T scalar, mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + scalar - m[0], + scalar - m[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return mat<2, 2, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m, T scalar) + { + return mat<2, 2, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(T scalar, mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator* + ( + mat<2, 2, T, Q> const& m, + typename mat<2, 2, T, Q>::row_type const& v + ) + { + return vec<2, T, Q>( + m[0][0] * v.x + m[1][0] * v.y, + m[0][1] * v.x + m[1][1] * v.y); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator* + ( + typename mat<2, 2, T, Q>::col_type const& v, + mat<2, 2, T, Q> const& m + ) + { + return vec<2, T, Q>( + v.x * m[0][0] + v.y * m[0][1], + v.x * m[1][0] + v.y * m[1][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return mat<2, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return mat<3, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return mat<4, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m, T scalar) + { + return mat<2, 2, T, Q>( + m[0] / scalar, + m[1] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(T scalar, mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + scalar / m[0], + scalar / m[1]); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator/(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v) + { + return inverse(m) * v; + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator/(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m) + { + return v * inverse(m); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + mat<2, 2, T, Q> m1_copy(m1); + return m1_copy /= m2; + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]); + } +} //namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_mat2x3.hpp b/NothinFancy/dep/include/glm/detail/type_mat2x3.hpp new file mode 100644 index 0000000..d6596e4 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat2x3.hpp @@ -0,0 +1,159 @@ +/// @ref core +/// @file glm/detail/type_mat2x3.hpp + +#pragma once + +#include "type_vec2.hpp" +#include "type_vec3.hpp" +#include +#include + +namespace glm +{ + template + struct mat<2, 3, T, Q> + { + typedef vec<3, T, Q> col_type; + typedef vec<2, T, Q> row_type; + typedef mat<2, 3, T, Q> type; + typedef mat<3, 2, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[2]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<2, 3, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, T z0, + T x1, T y1, T z1); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1); + + // -- Conversions -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 x1, Y1 y1, Z1 z1, + X2 x2, Y2 y2, Z2 z2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<3, U, Q> const& v1, + vec<3, V, Q> const& v2); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator=(mat<2, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator+=(mat<2, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator-=(mat<2, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<2, 3, T, Q> & operator++ (); + GLM_FUNC_DECL mat<2, 3, T, Q> & operator-- (); + GLM_FUNC_DECL mat<2, 3, T, Q> operator++(int); + GLM_FUNC_DECL mat<2, 3, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(T scalar, mat<2, 3, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<2, 3, T, Q>::col_type operator*(mat<2, 3, T, Q> const& m, typename mat<2, 3, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<2, 3, T, Q>::row_type operator*(typename mat<2, 3, T, Q>::col_type const& v, mat<2, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator/(mat<2, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator/(T scalar, mat<2, 3, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat2x3.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/type_mat2x3.inl b/NothinFancy/dep/include/glm/detail/type_mat2x3.inl new file mode 100644 index 0000000..5fec17e --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat2x3.inl @@ -0,0 +1,510 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0), col_type(0, 1, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0); + this->value[1] = col_type(0, 1, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<2, 3, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{m.value[0], m.value[1]} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(T scalar) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(scalar, 0, 0), col_type(0, scalar, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(scalar, 0, 0); + this->value[1] = col_type(0, scalar, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat + ( + T x0, T y0, T z0, + T x1, T y1, T z1 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0, z0), col_type(x1, y1, z1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(col_type const& v0, col_type const& v1) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v0); + this->value[1] = col_type(v1); +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat + ( + X1 x1, Y1 y1, Z1 z1, + X2 x2, Y2 y2, Z2 z2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x1, y1, z1), col_type(x2, y2, z2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x1, y1, z1); + this->value[1] = col_type(x2, y2, z2); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(vec<3, V1, Q> const& v1, vec<3, V2, Q> const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<2, 3, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::col_type & mat<2, 3, T, Q>::operator[](typename mat<2, 3, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 3, T, Q>::col_type const& mat<2, 3, T, Q>::operator[](typename mat<2, 3, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator=(mat<2, 3, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator+=(mat<2, 3, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator-=(mat<2, 3, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> mat<2, 3, T, Q>::operator++(int) + { + mat<2, 3, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> mat<2, 3, T, Q>::operator--(int) + { + mat<2, 3, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m) + { + return mat<2, 3, T, Q>( + -m[0], + -m[1]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m, T scalar) + { + return mat<2, 3, T, Q>( + m[0] + scalar, + m[1] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return mat<2, 3, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m, T scalar) + { + return mat<2, 3, T, Q>( + m[0] - scalar, + m[1] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return mat<2, 3, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m, T scalar) + { + return mat<2, 3, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(T scalar, mat<2, 3, T, Q> const& m) + { + return mat<2, 3, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::col_type operator* + ( + mat<2, 3, T, Q> const& m, + typename mat<2, 3, T, Q>::row_type const& v) + { + return typename mat<2, 3, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y, + m[0][1] * v.x + m[1][1] * v.y, + m[0][2] * v.x + m[1][2] * v.y); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::row_type operator* + ( + typename mat<2, 3, T, Q>::col_type const& v, + mat<2, 3, T, Q> const& m) + { + return typename mat<2, 3, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return mat<2, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + T SrcA00 = m1[0][0]; + T SrcA01 = m1[0][1]; + T SrcA02 = m1[0][2]; + T SrcA10 = m1[1][0]; + T SrcA11 = m1[1][1]; + T SrcA12 = m1[1][2]; + + T SrcB00 = m2[0][0]; + T SrcB01 = m2[0][1]; + T SrcB10 = m2[1][0]; + T SrcB11 = m2[1][1]; + T SrcB20 = m2[2][0]; + T SrcB21 = m2[2][1]; + + mat<3, 3, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return mat<4, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1], + m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator/(mat<2, 3, T, Q> const& m, T scalar) + { + return mat<2, 3, T, Q>( + m[0] / scalar, + m[1] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator/(T scalar, mat<2, 3, T, Q> const& m) + { + return mat<2, 3, T, Q>( + scalar / m[0], + scalar / m[1]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]); + } +} //namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_mat2x4.hpp b/NothinFancy/dep/include/glm/detail/type_mat2x4.hpp new file mode 100644 index 0000000..ff03e21 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat2x4.hpp @@ -0,0 +1,161 @@ +/// @ref core +/// @file glm/detail/type_mat2x4.hpp + +#pragma once + +#include "type_vec2.hpp" +#include "type_vec4.hpp" +#include +#include + +namespace glm +{ + template + struct mat<2, 4, T, Q> + { + typedef vec<4, T, Q> col_type; + typedef vec<2, T, Q> row_type; + typedef mat<2, 4, T, Q> type; + typedef mat<4, 2, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[2]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<2, 4, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, T z0, T w0, + T x1, T y1, T z1, T w1); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1); + + // -- Conversions -- + + template< + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 x1, Y1 y1, Z1 z1, W1 w1, + X2 x2, Y2 y2, Z2 z2, W2 w2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<4, U, Q> const& v1, + vec<4, V, Q> const& v2); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator=(mat<2, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator+=(mat<2, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator-=(mat<2, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<2, 4, T, Q> & operator++ (); + GLM_FUNC_DECL mat<2, 4, T, Q> & operator-- (); + GLM_FUNC_DECL mat<2, 4, T, Q> operator++(int); + GLM_FUNC_DECL mat<2, 4, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(T scalar, mat<2, 4, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<2, 4, T, Q>::col_type operator*(mat<2, 4, T, Q> const& m, typename mat<2, 4, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<2, 4, T, Q>::row_type operator*(typename mat<2, 4, T, Q>::col_type const& v, mat<2, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator/(mat<2, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator/(T scalar, mat<2, 4, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat2x4.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/type_mat2x4.inl b/NothinFancy/dep/include/glm/detail/type_mat2x4.inl new file mode 100644 index 0000000..b6d2b9d --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat2x4.inl @@ -0,0 +1,520 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0, 0), col_type(0, 1, 0, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0, 0); + this->value[1] = col_type(0, 1, 0, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<2, 4, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{m[0], m[1]} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(T s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0, 0, 0), col_type(0, s, 0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0, 0, 0); + this->value[1] = col_type(0, s, 0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat + ( + T x0, T y0, T z0, T w0, + T x1, T y1, T z1, T w1 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0, z0, w0), col_type(x1, y1, z1, w1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(col_type const& v0, col_type const& v1) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat + ( + X1 x1, Y1 y1, Z1 z1, W1 w1, + X2 x2, Y2 y2, Z2 z2, W2 w2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{ + col_type(x1, y1, z1, w1), + col_type(x2, y2, z2, w2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x1, y1, z1, w1); + this->value[1] = col_type(x2, y2, z2, w2); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(vec<4, V1, Q> const& v1, vec<4, V2, Q> const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<2, 4, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::col_type & mat<2, 4, T, Q>::operator[](typename mat<2, 4, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 4, T, Q>::col_type const& mat<2, 4, T, Q>::operator[](typename mat<2, 4, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator=(mat<2, 4, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator+=(mat<2, 4, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator-=(mat<2, 4, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> & mat<2, 4, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat<2, 4, T, Q>::operator++(int) + { + mat<2, 4, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat<2, 4, T, Q>::operator--(int) + { + mat<2, 4, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m) + { + return mat<2, 4, T, Q>( + -m[0], + -m[1]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m, T scalar) + { + return mat<2, 4, T, Q>( + m[0] + scalar, + m[1] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return mat<2, 4, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m, T scalar) + { + return mat<2, 4, T, Q>( + m[0] - scalar, + m[1] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return mat<2, 4, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m, T scalar) + { + return mat<2, 4, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(T scalar, mat<2, 4, T, Q> const& m) + { + return mat<2, 4, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::col_type operator*(mat<2, 4, T, Q> const& m, typename mat<2, 4, T, Q>::row_type const& v) + { + return typename mat<2, 4, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y, + m[0][1] * v.x + m[1][1] * v.y, + m[0][2] * v.x + m[1][2] * v.y, + m[0][3] * v.x + m[1][3] * v.y); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::row_type operator*(typename mat<2, 4, T, Q>::col_type const& v, mat<2, 4, T, Q> const& m) + { + return typename mat<2, 4, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + T SrcA00 = m1[0][0]; + T SrcA01 = m1[0][1]; + T SrcA02 = m1[0][2]; + T SrcA03 = m1[0][3]; + T SrcA10 = m1[1][0]; + T SrcA11 = m1[1][1]; + T SrcA12 = m1[1][2]; + T SrcA13 = m1[1][3]; + + T SrcB00 = m2[0][0]; + T SrcB01 = m2[0][1]; + T SrcB10 = m2[1][0]; + T SrcB11 = m2[1][1]; + T SrcB20 = m2[2][0]; + T SrcB21 = m2[2][1]; + T SrcB30 = m2[3][0]; + T SrcB31 = m2[3][1]; + + mat<4, 4, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01; + Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11; + Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21; + Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21; + Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31; + Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31; + Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31; + Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return mat<2, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return mat<3, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1], + m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator/(mat<2, 4, T, Q> const& m, T scalar) + { + return mat<2, 4, T, Q>( + m[0] / scalar, + m[1] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator/(T scalar, mat<2, 4, T, Q> const& m) + { + return mat<2, 4, T, Q>( + scalar / m[0], + scalar / m[1]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]); + } +} //namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_mat3x2.hpp b/NothinFancy/dep/include/glm/detail/type_mat3x2.hpp new file mode 100644 index 0000000..e166581 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat3x2.hpp @@ -0,0 +1,167 @@ +/// @ref core +/// @file glm/detail/type_mat3x2.hpp + +#pragma once + +#include "type_vec2.hpp" +#include "type_vec3.hpp" +#include +#include + +namespace glm +{ + template + struct mat<3, 2, T, Q> + { + typedef vec<2, T, Q> col_type; + typedef vec<3, T, Q> row_type; + typedef mat<3, 2, T, Q> type; + typedef mat<2, 3, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[3]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<3, 2, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, + T x1, T y1, + T x2, T y2); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2); + + // -- Conversions -- + + template< + typename X1, typename Y1, + typename X2, typename Y2, + typename X3, typename Y3> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 x1, Y1 y1, + X2 x2, Y2 y2, + X3 x3, Y3 y3); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<2, V1, Q> const& v1, + vec<2, V2, Q> const& v2, + vec<2, V3, Q> const& v3); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator=(mat<3, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator+=(mat<3, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator-=(mat<3, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<3, 2, T, Q> & operator++ (); + GLM_FUNC_DECL mat<3, 2, T, Q> & operator-- (); + GLM_FUNC_DECL mat<3, 2, T, Q> operator++(int); + GLM_FUNC_DECL mat<3, 2, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(T scalar, mat<3, 2, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<3, 2, T, Q>::col_type operator*(mat<3, 2, T, Q> const& m, typename mat<3, 2, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<3, 2, T, Q>::row_type operator*(typename mat<3, 2, T, Q>::col_type const& v, mat<3, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator/(mat<3, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator/(T scalar, mat<3, 2, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat3x2.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/type_mat3x2.inl b/NothinFancy/dep/include/glm/detail/type_mat3x2.inl new file mode 100644 index 0000000..b4b948b --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat3x2.inl @@ -0,0 +1,532 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0), col_type(0, 1), col_type(0, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0); + this->value[1] = col_type(0, 1); + this->value[2] = col_type(0, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<3, 2, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(T s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0), col_type(0, s), col_type(0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0); + this->value[1] = col_type(0, s); + this->value[2] = col_type(0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat + ( + T x0, T y0, + T x1, T y1, + T x2, T y2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0), col_type(x1, y1), col_type(x2, y2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + this->value[2] = col_type(x2, y2); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X0, typename Y0, + typename X1, typename Y1, + typename X2, typename Y2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat + ( + X0 x0, Y0 y0, + X1 x1, Y1 y1, + X2 x2, Y2 y2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0), col_type(x1, y1), col_type(x2, y2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + this->value[2] = col_type(x2, y2); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(vec<2, V0, Q> const& v0, vec<2, V1, Q> const& v1, vec<2, V2, Q> const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v0); + this->value[1] = col_type(v1); + this->value[2] = col_type(v2); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<3, 2, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::col_type & mat<3, 2, T, Q>::operator[](typename mat<3, 2, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 2, T, Q>::col_type const& mat<3, 2, T, Q>::operator[](typename mat<3, 2, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator=(mat<3, 2, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator+=(mat<3, 2, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator-=(mat<3, 2, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> & mat<3, 2, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> mat<3, 2, T, Q>::operator++(int) + { + mat<3, 2, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> mat<3, 2, T, Q>::operator--(int) + { + mat<3, 2, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m) + { + return mat<3, 2, T, Q>( + -m[0], + -m[1], + -m[2]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m, T scalar) + { + return mat<3, 2, T, Q>( + m[0] + scalar, + m[1] + scalar, + m[2] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return mat<3, 2, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m, T scalar) + { + return mat<3, 2, T, Q>( + m[0] - scalar, + m[1] - scalar, + m[2] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return mat<3, 2, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m, T scalar) + { + return mat<3, 2, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(T scalar, mat<3, 2, T, Q> const& m) + { + return mat<3, 2, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::col_type operator*(mat<3, 2, T, Q> const& m, typename mat<3, 2, T, Q>::row_type const& v) + { + return typename mat<3, 2, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::row_type operator*(typename mat<3, 2, T, Q>::col_type const& v, mat<3, 2, T, Q> const& m) + { + return typename mat<3, 2, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1], + v.x * m[1][0] + v.y * m[1][1], + v.x * m[2][0] + v.y * m[2][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + const T SrcA00 = m1[0][0]; + const T SrcA01 = m1[0][1]; + const T SrcA10 = m1[1][0]; + const T SrcA11 = m1[1][1]; + const T SrcA20 = m1[2][0]; + const T SrcA21 = m1[2][1]; + + const T SrcB00 = m2[0][0]; + const T SrcB01 = m2[0][1]; + const T SrcB02 = m2[0][2]; + const T SrcB10 = m2[1][0]; + const T SrcB11 = m2[1][1]; + const T SrcB12 = m2[1][2]; + + mat<2, 2, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return mat<3, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return mat<4, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator/(mat<3, 2, T, Q> const& m, T scalar) + { + return mat<3, 2, T, Q>( + m[0] / scalar, + m[1] / scalar, + m[2] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator/(T scalar, mat<3, 2, T, Q> const& m) + { + return mat<3, 2, T, Q>( + scalar / m[0], + scalar / m[1], + scalar / m[2]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); + } +} //namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_mat3x3.hpp b/NothinFancy/dep/include/glm/detail/type_mat3x3.hpp new file mode 100644 index 0000000..3174872 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat3x3.hpp @@ -0,0 +1,184 @@ +/// @ref core +/// @file glm/detail/type_mat3x3.hpp + +#pragma once + +#include "type_vec3.hpp" +#include +#include + +namespace glm +{ + template + struct mat<3, 3, T, Q> + { + typedef vec<3, T, Q> col_type; + typedef vec<3, T, Q> row_type; + typedef mat<3, 3, T, Q> type; + typedef mat<3, 3, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[3]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<3, 3, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, T z0, + T x1, T y1, T z1, + T x2, T y2, T z2); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2); + + // -- Conversions -- + + template< + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 x1, Y1 y1, Z1 z1, + X2 x2, Y2 y2, Z2 z2, + X3 x3, Y3 y3, Z3 z3); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<3, V1, Q> const& v1, + vec<3, V2, Q> const& v2, + vec<3, V3, Q> const& v3); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator=(mat<3, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator+=(mat<3, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator-=(mat<3, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator*=(mat<3, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator/=(U s); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator/=(mat<3, 3, U, Q> const& m); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<3, 3, T, Q> & operator++(); + GLM_FUNC_DECL mat<3, 3, T, Q> & operator--(); + GLM_FUNC_DECL mat<3, 3, T, Q> operator++(int); + GLM_FUNC_DECL mat<3, 3, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(T scalar, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(T scalar, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(T scalar, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<3, 3, T, Q>::col_type operator*(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<3, 3, T, Q>::row_type operator*(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator/(T scalar, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<3, 3, T, Q>::col_type operator/(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<3, 3, T, Q>::row_type operator/(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat3x3.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/type_mat3x3.inl b/NothinFancy/dep/include/glm/detail/type_mat3x3.inl new file mode 100644 index 0000000..1ddaf99 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat3x3.inl @@ -0,0 +1,601 @@ +#include "../matrix.hpp" + +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0), col_type(0, 1, 0), col_type(0, 0, 1)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0); + this->value[1] = col_type(0, 1, 0); + this->value[2] = col_type(0, 0, 1); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 3, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(T s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0, 0), col_type(0, s, 0), col_type(0, 0, s)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0, 0); + this->value[1] = col_type(0, s, 0); + this->value[2] = col_type(0, 0, s); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat + ( + T x0, T y0, T z0, + T x1, T y1, T z1, + T x2, T y2, T z2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0, z0), col_type(x1, y1, z1), col_type(x2, y2, z2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); + this->value[2] = col_type(x2, y2, z2); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v0); + this->value[1] = col_type(v1); + this->value[2] = col_type(v2); +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat + ( + X1 x1, Y1 y1, Z1 z1, + X2 x2, Y2 y2, Z2 z2, + X3 x3, Y3 y3, Z3 z3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x1, y1, z1), col_type(x2, y2, z2), col_type(x3, y3, z3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x1, y1, z1); + this->value[1] = col_type(x2, y2, z2); + this->value[2] = col_type(x3, y3, z3); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(vec<3, V1, Q> const& v1, vec<3, V2, Q> const& v2, vec<3, V3, Q> const& v3) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2), col_type(v3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 3, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type & mat<3, 3, T, Q>::operator[](typename mat<3, 3, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 3, T, Q>::col_type const& mat<3, 3, T, Q>::operator[](typename mat<3, 3, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator=(mat<3, 3, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator+=(mat<3, 3, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator-=(mat<3, 3, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator*=(mat<3, 3, U, Q> const& m) + { + return (*this = *this * m); + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator/=(mat<3, 3, U, Q> const& m) + { + return *this *= inverse(m); + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat<3, 3, T, Q>::operator++(int) + { + mat<3, 3, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat<3, 3, T, Q>::operator--(int) + { + mat<3, 3, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m) + { + return mat<3, 3, T, Q>( + -m[0], + -m[1], + -m[2]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m, T scalar) + { + return mat<3, 3, T, Q>( + m[0] + scalar, + m[1] + scalar, + m[2] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(T scalar, mat<3, 3, T, Q> const& m) + { + return mat<3, 3, T, Q>( + m[0] + scalar, + m[1] + scalar, + m[2] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return mat<3, 3, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m, T scalar) + { + return mat<3, 3, T, Q>( + m[0] - scalar, + m[1] - scalar, + m[2] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(T scalar, mat<3, 3, T, Q> const& m) + { + return mat<3, 3, T, Q>( + scalar - m[0], + scalar - m[1], + scalar - m[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return mat<3, 3, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m, T scalar) + { + return mat<3, 3, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(T scalar, mat<3, 3, T, Q> const& m) + { + return mat<3, 3, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type operator*(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v) + { + return typename mat<3, 3, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z, + m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::row_type operator*(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m) + { + return typename mat<3, 3, T, Q>::row_type( + m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z, + m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z, + m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + T const SrcA00 = m1[0][0]; + T const SrcA01 = m1[0][1]; + T const SrcA02 = m1[0][2]; + T const SrcA10 = m1[1][0]; + T const SrcA11 = m1[1][1]; + T const SrcA12 = m1[1][2]; + T const SrcA20 = m1[2][0]; + T const SrcA21 = m1[2][1]; + T const SrcA22 = m1[2][2]; + + T const SrcB00 = m2[0][0]; + T const SrcB01 = m2[0][1]; + T const SrcB02 = m2[0][2]; + T const SrcB10 = m2[1][0]; + T const SrcB11 = m2[1][1]; + T const SrcB12 = m2[1][2]; + T const SrcB20 = m2[2][0]; + T const SrcB21 = m2[2][1]; + T const SrcB22 = m2[2][2]; + + mat<3, 3, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return mat<2, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return mat<4, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2], + m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m, T scalar) + { + return mat<3, 3, T, Q>( + m[0] / scalar, + m[1] / scalar, + m[2] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(T scalar, mat<3, 3, T, Q> const& m) + { + return mat<3, 3, T, Q>( + scalar / m[0], + scalar / m[1], + scalar / m[2]); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type operator/(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v) + { + return inverse(m) * v; + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::row_type operator/(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m) + { + return v * inverse(m); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + mat<3, 3, T, Q> m1_copy(m1); + return m1_copy /= m2; + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); + } +} //namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_mat3x4.hpp b/NothinFancy/dep/include/glm/detail/type_mat3x4.hpp new file mode 100644 index 0000000..6e40b90 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat3x4.hpp @@ -0,0 +1,166 @@ +/// @ref core +/// @file glm/detail/type_mat3x4.hpp + +#pragma once + +#include "type_vec3.hpp" +#include "type_vec4.hpp" +#include +#include + +namespace glm +{ + template + struct mat<3, 4, T, Q> + { + typedef vec<4, T, Q> col_type; + typedef vec<3, T, Q> row_type; + typedef mat<3, 4, T, Q> type; + typedef mat<4, 3, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[3]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<3, 4, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, T z0, T w0, + T x1, T y1, T z1, T w1, + T x2, T y2, T z2, T w2); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2); + + // -- Conversions -- + + template< + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2, + typename X3, typename Y3, typename Z3, typename W3> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 x1, Y1 y1, Z1 z1, W1 w1, + X2 x2, Y2 y2, Z2 z2, W2 w2, + X3 x3, Y3 y3, Z3 z3, W3 w3); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<4, V1, Q> const& v1, + vec<4, V2, Q> const& v2, + vec<4, V3, Q> const& v3); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator=(mat<3, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator+=(mat<3, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator-=(mat<3, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<3, 4, T, Q> & operator++(); + GLM_FUNC_DECL mat<3, 4, T, Q> & operator--(); + GLM_FUNC_DECL mat<3, 4, T, Q> operator++(int); + GLM_FUNC_DECL mat<3, 4, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(T scalar, mat<3, 4, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<3, 4, T, Q>::col_type operator*(mat<3, 4, T, Q> const& m, typename mat<3, 4, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<3, 4, T, Q>::row_type operator*(typename mat<3, 4, T, Q>::col_type const& v, mat<3, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator/(mat<3, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator/(T scalar, mat<3, 4, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat3x4.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/type_mat3x4.inl b/NothinFancy/dep/include/glm/detail/type_mat3x4.inl new file mode 100644 index 0000000..6ee416c --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat3x4.inl @@ -0,0 +1,578 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0, 0), col_type(0, 1, 0, 0), col_type(0, 0, 1, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0, 0); + this->value[1] = col_type(0, 1, 0, 0); + this->value[2] = col_type(0, 0, 1, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<3, 4, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(T s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0, 0, 0), col_type(0, s, 0, 0), col_type(0, 0, s, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0, 0, 0); + this->value[1] = col_type(0, s, 0, 0); + this->value[2] = col_type(0, 0, s, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat + ( + T x0, T y0, T z0, T w0, + T x1, T y1, T z1, T w1, + T x2, T y2, T z2, T w2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{ + col_type(x0, y0, z0, w0), + col_type(x1, y1, z1, w1), + col_type(x2, y2, z2, w2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); + this->value[2] = col_type(x2, y2, z2, w2); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X0, typename Y0, typename Z0, typename W0, + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat + ( + X0 x0, Y0 y0, Z0 z0, W0 w0, + X1 x1, Y1 y1, Z1 z1, W1 w1, + X2 x2, Y2 y2, Z2 z2, W2 w2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{ + col_type(x0, y0, z0, w0), + col_type(x1, y1, z1, w1), + col_type(x2, y2, z2, w2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); + this->value[2] = col_type(x2, y2, z2, w2); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(vec<4, V1, Q> const& v0, vec<4, V2, Q> const& v1, vec<4, V3, Q> const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v0); + this->value[1] = col_type(v1); + this->value[2] = col_type(v2); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<3, 4, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(0, 0, 1, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(0, 0, 1, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(0, 0, 1, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(0, 0, 1, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(m[2], 1, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(m[2], 1, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0, 0, 1, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(m[2], 1, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(m[2], 1, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 0); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::col_type & mat<3, 4, T, Q>::operator[](typename mat<3, 4, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 4, T, Q>::col_type const& mat<3, 4, T, Q>::operator[](typename mat<3, 4, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator=(mat<3, 4, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator+=(mat<3, 4, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator-=(mat<3, 4, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> & mat<3, 4, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat<3, 4, T, Q>::operator++(int) + { + mat<3, 4, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat<3, 4, T, Q>::operator--(int) + { + mat<3, 4, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m) + { + return mat<3, 4, T, Q>( + -m[0], + -m[1], + -m[2]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m, T scalar) + { + return mat<3, 4, T, Q>( + m[0] + scalar, + m[1] + scalar, + m[2] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return mat<3, 4, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m, T scalar) + { + return mat<3, 4, T, Q>( + m[0] - scalar, + m[1] - scalar, + m[2] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return mat<3, 4, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m, T scalar) + { + return mat<3, 4, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(T scalar, mat<3, 4, T, Q> const& m) + { + return mat<3, 4, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::col_type operator* + ( + mat<3, 4, T, Q> const& m, + typename mat<3, 4, T, Q>::row_type const& v + ) + { + return typename mat<3, 4, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z, + m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z, + m[0][3] * v.x + m[1][3] * v.y + m[2][3] * v.z); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::row_type operator* + ( + typename mat<3, 4, T, Q>::col_type const& v, + mat<3, 4, T, Q> const& m + ) + { + return typename mat<3, 4, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3], + v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2] + v.w * m[2][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + const T SrcA00 = m1[0][0]; + const T SrcA01 = m1[0][1]; + const T SrcA02 = m1[0][2]; + const T SrcA03 = m1[0][3]; + const T SrcA10 = m1[1][0]; + const T SrcA11 = m1[1][1]; + const T SrcA12 = m1[1][2]; + const T SrcA13 = m1[1][3]; + const T SrcA20 = m1[2][0]; + const T SrcA21 = m1[2][1]; + const T SrcA22 = m1[2][2]; + const T SrcA23 = m1[2][3]; + + const T SrcB00 = m2[0][0]; + const T SrcB01 = m2[0][1]; + const T SrcB02 = m2[0][2]; + const T SrcB10 = m2[1][0]; + const T SrcB11 = m2[1][1]; + const T SrcB12 = m2[1][2]; + const T SrcB20 = m2[2][0]; + const T SrcB21 = m2[2][1]; + const T SrcB22 = m2[2][2]; + const T SrcB30 = m2[3][0]; + const T SrcB31 = m2[3][1]; + const T SrcB32 = m2[3][2]; + + mat<4, 4, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02; + Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01 + SrcA23 * SrcB02; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12; + Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11 + SrcA23 * SrcB12; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22; + Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21 + SrcA23 * SrcB22; + Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31 + SrcA20 * SrcB32; + Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31 + SrcA21 * SrcB32; + Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31 + SrcA22 * SrcB32; + Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31 + SrcA23 * SrcB32; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return mat<2, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return mat<3, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2], + m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator/(mat<3, 4, T, Q> const& m, T scalar) + { + return mat<3, 4, T, Q>( + m[0] / scalar, + m[1] / scalar, + m[2] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator/(T scalar, mat<3, 4, T, Q> const& m) + { + return mat<3, 4, T, Q>( + scalar / m[0], + scalar / m[1], + scalar / m[2]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); + } +} //namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_mat4x2.hpp b/NothinFancy/dep/include/glm/detail/type_mat4x2.hpp new file mode 100644 index 0000000..8d34352 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat4x2.hpp @@ -0,0 +1,171 @@ +/// @ref core +/// @file glm/detail/type_mat4x2.hpp + +#pragma once + +#include "type_vec2.hpp" +#include "type_vec4.hpp" +#include +#include + +namespace glm +{ + template + struct mat<4, 2, T, Q> + { + typedef vec<2, T, Q> col_type; + typedef vec<4, T, Q> row_type; + typedef mat<4, 2, T, Q> type; + typedef mat<2, 4, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[4]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 4; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<4, 2, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, + T x1, T y1, + T x2, T y2, + T x3, T y3); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3); + + // -- Conversions -- + + template< + typename X0, typename Y0, + typename X1, typename Y1, + typename X2, typename Y2, + typename X3, typename Y3> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X0 x0, Y0 y0, + X1 x1, Y1 y1, + X2 x2, Y2 y2, + X3 x3, Y3 y3); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<2, V1, Q> const& v1, + vec<2, V2, Q> const& v2, + vec<2, V3, Q> const& v3, + vec<2, V4, Q> const& v4); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator=(mat<4, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator+=(mat<4, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator-=(mat<4, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<4, 2, T, Q> & operator++ (); + GLM_FUNC_DECL mat<4, 2, T, Q> & operator-- (); + GLM_FUNC_DECL mat<4, 2, T, Q> operator++(int); + GLM_FUNC_DECL mat<4, 2, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(T scalar, mat<4, 2, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<4, 2, T, Q>::col_type operator*(mat<4, 2, T, Q> const& m, typename mat<4, 2, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<4, 2, T, Q>::row_type operator*(typename mat<4, 2, T, Q>::col_type const& v, mat<4, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator/(mat<4, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator/(T scalar, mat<4, 2, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat4x2.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/type_mat4x2.inl b/NothinFancy/dep/include/glm/detail/type_mat4x2.inl new file mode 100644 index 0000000..419c80c --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat4x2.inl @@ -0,0 +1,574 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0), col_type(0, 1), col_type(0, 0), col_type(0, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0); + this->value[1] = col_type(0, 1); + this->value[2] = col_type(0, 0); + this->value[3] = col_type(0, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<4, 2, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(T s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0), col_type(0, s), col_type(0, 0), col_type(0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0); + this->value[1] = col_type(0, s); + this->value[2] = col_type(0, 0); + this->value[3] = col_type(0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat + ( + T x0, T y0, + T x1, T y1, + T x2, T y2, + T x3, T y3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0), col_type(x1, y1), col_type(x2, y2), col_type(x3, y3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + this->value[2] = col_type(x2, y2); + this->value[3] = col_type(x3, y3); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2, col_type const& v3) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2), col_type(v3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + this->value[3] = v3; +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X0, typename Y0, + typename X1, typename Y1, + typename X2, typename Y2, + typename X3, typename Y3> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat + ( + X0 x0, Y0 y0, + X1 x1, Y1 y1, + X2 x2, Y2 y2, + X3 x3, Y3 y3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0), col_type(x1, y1), col_type(x2, y2), col_type(x3, y3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + this->value[2] = col_type(x2, y2); + this->value[3] = col_type(x3, y3); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(vec<2, V0, Q> const& v0, vec<2, V1, Q> const& v1, vec<2, V2, Q> const& v2, vec<2, V3, Q> const& v3) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2), col_type(v3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v0); + this->value[1] = col_type(v1); + this->value[2] = col_type(v2); + this->value[3] = col_type(v3); +# endif + } + + // -- Conversion -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<4, 2, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(0); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::col_type & mat<4, 2, T, Q>::operator[](typename mat<4, 2, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<4, 2, T, Q>::col_type const& mat<4, 2, T, Q>::operator[](typename mat<4, 2, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q>& mat<4, 2, T, Q>::operator=(mat<4, 2, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + this->value[3] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator+=(mat<4, 2, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + this->value[3] += m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + this->value[3] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator-=(mat<4, 2, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + this->value[3] -= m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + this->value[3] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + this->value[3] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + ++this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + --this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> mat<4, 2, T, Q>::operator++(int) + { + mat<4, 2, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> mat<4, 2, T, Q>::operator--(int) + { + mat<4, 2, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m) + { + return mat<4, 2, T, Q>( + -m[0], + -m[1], + -m[2], + -m[3]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m, T scalar) + { + return mat<4, 2, T, Q>( + m[0] + scalar, + m[1] + scalar, + m[2] + scalar, + m[3] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return mat<4, 2, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2], + m1[3] + m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m, T scalar) + { + return mat<4, 2, T, Q>( + m[0] - scalar, + m[1] - scalar, + m[2] - scalar, + m[3] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return mat<4, 2, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2], + m1[3] - m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m, T scalar) + { + return mat<4, 2, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar, + m[3] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(T scalar, mat<4, 2, T, Q> const& m) + { + return mat<4, 2, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar, + m[3] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::col_type operator*(mat<4, 2, T, Q> const& m, typename mat<4, 2, T, Q>::row_type const& v) + { + return typename mat<4, 2, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::row_type operator*(typename mat<4, 2, T, Q>::col_type const& v, mat<4, 2, T, Q> const& m) + { + return typename mat<4, 2, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1], + v.x * m[1][0] + v.y * m[1][1], + v.x * m[2][0] + v.y * m[2][1], + v.x * m[3][0] + v.y * m[3][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + T const SrcA00 = m1[0][0]; + T const SrcA01 = m1[0][1]; + T const SrcA10 = m1[1][0]; + T const SrcA11 = m1[1][1]; + T const SrcA20 = m1[2][0]; + T const SrcA21 = m1[2][1]; + T const SrcA30 = m1[3][0]; + T const SrcA31 = m1[3][1]; + + T const SrcB00 = m2[0][0]; + T const SrcB01 = m2[0][1]; + T const SrcB02 = m2[0][2]; + T const SrcB03 = m2[0][3]; + T const SrcB10 = m2[1][0]; + T const SrcB11 = m2[1][1]; + T const SrcB12 = m2[1][2]; + T const SrcB13 = m2[1][3]; + + mat<2, 2, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return mat<3, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return mat<4, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator/(mat<4, 2, T, Q> const& m, T scalar) + { + return mat<4, 2, T, Q>( + m[0] / scalar, + m[1] / scalar, + m[2] / scalar, + m[3] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator/(T scalar, mat<4, 2, T, Q> const& m) + { + return mat<4, 2, T, Q>( + scalar / m[0], + scalar / m[1], + scalar / m[2], + scalar / m[3]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); + } +} //namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_mat4x3.hpp b/NothinFancy/dep/include/glm/detail/type_mat4x3.hpp new file mode 100644 index 0000000..16e4270 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat4x3.hpp @@ -0,0 +1,171 @@ +/// @ref core +/// @file glm/detail/type_mat4x3.hpp + +#pragma once + +#include "type_vec3.hpp" +#include "type_vec4.hpp" +#include +#include + +namespace glm +{ + template + struct mat<4, 3, T, Q> + { + typedef vec<3, T, Q> col_type; + typedef vec<4, T, Q> row_type; + typedef mat<4, 3, T, Q> type; + typedef mat<3, 4, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[4]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 4; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<4, 3, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T const& x); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T const& x0, T const& y0, T const& z0, + T const& x1, T const& y1, T const& z1, + T const& x2, T const& y2, T const& z2, + T const& x3, T const& y3, T const& z3); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3); + + // -- Conversions -- + + template< + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3, + typename X4, typename Y4, typename Z4> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 const& x1, Y1 const& y1, Z1 const& z1, + X2 const& x2, Y2 const& y2, Z2 const& z2, + X3 const& x3, Y3 const& y3, Z3 const& z3, + X4 const& x4, Y4 const& y4, Z4 const& z4); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<3, V1, Q> const& v1, + vec<3, V2, Q> const& v2, + vec<3, V3, Q> const& v3, + vec<3, V4, Q> const& v4); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator=(mat<4, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator+=(mat<4, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator-=(mat<4, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<4, 3, T, Q>& operator++(); + GLM_FUNC_DECL mat<4, 3, T, Q>& operator--(); + GLM_FUNC_DECL mat<4, 3, T, Q> operator++(int); + GLM_FUNC_DECL mat<4, 3, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(T const& s, mat<4, 3, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<4, 3, T, Q>::col_type operator*(mat<4, 3, T, Q> const& m, typename mat<4, 3, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<4, 3, T, Q>::row_type operator*(typename mat<4, 3, T, Q>::col_type const& v, mat<4, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator/(mat<4, 3, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator/(T const& s, mat<4, 3, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat4x3.inl" +#endif //GLM_EXTERNAL_TEMPLATE diff --git a/NothinFancy/dep/include/glm/detail/type_mat4x3.inl b/NothinFancy/dep/include/glm/detail/type_mat4x3.inl new file mode 100644 index 0000000..11b1ee3 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat4x3.inl @@ -0,0 +1,598 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0), col_type(0, 1, 0), col_type(0, 0, 1), col_type(0, 0, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0); + this->value[1] = col_type(0, 1, 0); + this->value[2] = col_type(0, 0, 1); + this->value[3] = col_type(0, 0, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<4, 3, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(T const& s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0, 0), col_type(0, s, 0), col_type(0, 0, s), col_type(0, 0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0, 0); + this->value[1] = col_type(0, s, 0); + this->value[2] = col_type(0, 0, s); + this->value[3] = col_type(0, 0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat + ( + T const& x0, T const& y0, T const& z0, + T const& x1, T const& y1, T const& z1, + T const& x2, T const& y2, T const& z2, + T const& x3, T const& y3, T const& z3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0, z0), col_type(x1, y1, z1), col_type(x2, y2, z2), col_type(x3, y3, z3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); + this->value[2] = col_type(x2, y2, z2); + this->value[3] = col_type(x3, y3, z3); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2, col_type const& v3) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2), col_type(v3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + this->value[3] = v3; +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X0, typename Y0, typename Z0, + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat + ( + X0 const& x0, Y0 const& y0, Z0 const& z0, + X1 const& x1, Y1 const& y1, Z1 const& z1, + X2 const& x2, Y2 const& y2, Z2 const& z2, + X3 const& x3, Y3 const& y3, Z3 const& z3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0, z0), col_type(x1, y1, z1), col_type(x2, y2, z2), col_type(x3, y3, z3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); + this->value[2] = col_type(x2, y2, z2); + this->value[3] = col_type(x3, y3, z3); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(vec<3, V1, Q> const& v1, vec<3, V2, Q> const& v2, vec<3, V3, Q> const& v3, vec<3, V4, Q> const& v4) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2), col_type(v3), col_type(v4)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); + this->value[3] = col_type(v4); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<4, 3, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(0, 0, 1), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(0, 0, 1); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0, 0, 1); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 1), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 1); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0, 0, 1); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 1), col_type(m[3], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 1); + this->value[3] = col_type(m[3], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(0); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::col_type & mat<4, 3, T, Q>::operator[](typename mat<4, 3, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<4, 3, T, Q>::col_type const& mat<4, 3, T, Q>::operator[](typename mat<4, 3, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q>& mat<4, 3, T, Q>::operator=(mat<4, 3, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + this->value[3] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator+=(mat<4, 3, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + this->value[3] += m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + this->value[3] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator-=(mat<4, 3, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + this->value[3] -= m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + this->value[3] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + this->value[3] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + ++this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + --this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> mat<4, 3, T, Q>::operator++(int) + { + mat<4, 3, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> mat<4, 3, T, Q>::operator--(int) + { + mat<4, 3, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m) + { + return mat<4, 3, T, Q>( + -m[0], + -m[1], + -m[2], + -m[3]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m, T const& s) + { + return mat<4, 3, T, Q>( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return mat<4, 3, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2], + m1[3] + m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m, T const& s) + { + return mat<4, 3, T, Q>( + m[0] - s, + m[1] - s, + m[2] - s, + m[3] - s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return mat<4, 3, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2], + m1[3] - m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m, T const& s) + { + return mat<4, 3, T, Q>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(T const& s, mat<4, 3, T, Q> const& m) + { + return mat<4, 3, T, Q>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::col_type operator* + ( + mat<4, 3, T, Q> const& m, + typename mat<4, 3, T, Q>::row_type const& v) + { + return typename mat<4, 3, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w, + m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * v.w); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::row_type operator* + ( + typename mat<4, 3, T, Q>::col_type const& v, + mat<4, 3, T, Q> const& m) + { + return typename mat<4, 3, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2], + v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2], + v.x * m[3][0] + v.y * m[3][1] + v.z * m[3][2]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return mat<2, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + T const SrcA00 = m1[0][0]; + T const SrcA01 = m1[0][1]; + T const SrcA02 = m1[0][2]; + T const SrcA10 = m1[1][0]; + T const SrcA11 = m1[1][1]; + T const SrcA12 = m1[1][2]; + T const SrcA20 = m1[2][0]; + T const SrcA21 = m1[2][1]; + T const SrcA22 = m1[2][2]; + T const SrcA30 = m1[3][0]; + T const SrcA31 = m1[3][1]; + T const SrcA32 = m1[3][2]; + + T const SrcB00 = m2[0][0]; + T const SrcB01 = m2[0][1]; + T const SrcB02 = m2[0][2]; + T const SrcB03 = m2[0][3]; + T const SrcB10 = m2[1][0]; + T const SrcB11 = m2[1][1]; + T const SrcB12 = m2[1][2]; + T const SrcB13 = m2[1][3]; + T const SrcB20 = m2[2][0]; + T const SrcB21 = m2[2][1]; + T const SrcB22 = m2[2][2]; + T const SrcB23 = m2[2][3]; + + mat<3, 3, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02 + SrcA32 * SrcB03; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12 + SrcA32 * SrcB13; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22 + SrcA30 * SrcB23; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22 + SrcA31 * SrcB23; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22 + SrcA32 * SrcB23; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return mat<4, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3], + m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2] + m1[3][2] * m2[3][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator/(mat<4, 3, T, Q> const& m, T const& s) + { + return mat<4, 3, T, Q>( + m[0] / s, + m[1] / s, + m[2] / s, + m[3] / s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator/(T const& s, mat<4, 3, T, Q> const& m) + { + return mat<4, 3, T, Q>( + s / m[0], + s / m[1], + s / m[2], + s / m[3]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); + } +} //namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_mat4x4.hpp b/NothinFancy/dep/include/glm/detail/type_mat4x4.hpp new file mode 100644 index 0000000..3517f9f --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat4x4.hpp @@ -0,0 +1,189 @@ +/// @ref core +/// @file glm/detail/type_mat4x4.hpp + +#pragma once + +#include "type_vec4.hpp" +#include +#include + +namespace glm +{ + template + struct mat<4, 4, T, Q> + { + typedef vec<4, T, Q> col_type; + typedef vec<4, T, Q> row_type; + typedef mat<4, 4, T, Q> type; + typedef mat<4, 4, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[4]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;} + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<4, 4, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T const& x); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T const& x0, T const& y0, T const& z0, T const& w0, + T const& x1, T const& y1, T const& z1, T const& w1, + T const& x2, T const& y2, T const& z2, T const& w2, + T const& x3, T const& y3, T const& z3, T const& w3); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3); + + // -- Conversions -- + + template< + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2, + typename X3, typename Y3, typename Z3, typename W3, + typename X4, typename Y4, typename Z4, typename W4> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 const& x1, Y1 const& y1, Z1 const& z1, W1 const& w1, + X2 const& x2, Y2 const& y2, Z2 const& z2, W2 const& w2, + X3 const& x3, Y3 const& y3, Z3 const& z3, W3 const& w3, + X4 const& x4, Y4 const& y4, Z4 const& z4, W4 const& w4); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<4, V1, Q> const& v1, + vec<4, V2, Q> const& v2, + vec<4, V3, Q> const& v3, + vec<4, V4, Q> const& v4); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator=(mat<4, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator+=(mat<4, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator-=(mat<4, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator*=(mat<4, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator/=(U s); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator/=(mat<4, 4, U, Q> const& m); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<4, 4, T, Q> & operator++(); + GLM_FUNC_DECL mat<4, 4, T, Q> & operator--(); + GLM_FUNC_DECL mat<4, 4, T, Q> operator++(int); + GLM_FUNC_DECL mat<4, 4, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(T const& s, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(T const& s, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(T const& s, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<4, 4, T, Q>::col_type operator*(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<4, 4, T, Q>::row_type operator*(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator/(T const& s, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<4, 4, T, Q>::col_type operator/(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<4, 4, T, Q>::row_type operator/(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat4x4.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/NothinFancy/dep/include/glm/detail/type_mat4x4.inl b/NothinFancy/dep/include/glm/detail/type_mat4x4.inl new file mode 100644 index 0000000..e38b87f --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat4x4.inl @@ -0,0 +1,706 @@ +#include "../matrix.hpp" + +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0, 0), col_type(0, 1, 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0, 0); + this->value[1] = col_type(0, 1, 0, 0); + this->value[2] = col_type(0, 0, 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 4, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(T const& s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0, 0, 0), col_type(0, s, 0, 0), col_type(0, 0, s, 0), col_type(0, 0, 0, s)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0, 0, 0); + this->value[1] = col_type(0, s, 0, 0); + this->value[2] = col_type(0, 0, s, 0); + this->value[3] = col_type(0, 0, 0, s); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat + ( + T const& x0, T const& y0, T const& z0, T const& w0, + T const& x1, T const& y1, T const& z1, T const& w1, + T const& x2, T const& y2, T const& z2, T const& w2, + T const& x3, T const& y3, T const& z3, T const& w3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{ + col_type(x0, y0, z0, w0), + col_type(x1, y1, z1, w1), + col_type(x2, y2, z2, w2), + col_type(x3, y3, z3, w3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); + this->value[2] = col_type(x2, y2, z2, w2); + this->value[3] = col_type(x3, y3, z3, w3); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2, col_type const& v3) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2), col_type(v3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + this->value[3] = v3; +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 4, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + // -- Conversions -- + + template + template< + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2, + typename X3, typename Y3, typename Z3, typename W3, + typename X4, typename Y4, typename Z4, typename W4> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat + ( + X1 const& x1, Y1 const& y1, Z1 const& z1, W1 const& w1, + X2 const& x2, Y2 const& y2, Z2 const& z2, W2 const& w2, + X3 const& x3, Y3 const& y3, Z3 const& z3, W3 const& w3, + X4 const& x4, Y4 const& y4, Z4 const& z4, W4 const& w4 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x1, y1, z1, w1), col_type(x2, y2, z2, w2), col_type(x3, y3, z3, w3), col_type(x4, y4, z4, w4)} +# endif + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 4th parameter type invalid."); + + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 5th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 6th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 7th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 8th parameter type invalid."); + + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 9th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 10th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 11th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 12th parameter type invalid."); + + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 13th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 14th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 15th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 16th parameter type invalid."); + +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x1, y1, z1, w1); + this->value[1] = col_type(x2, y2, z2, w2); + this->value[2] = col_type(x3, y3, z3, w3); + this->value[3] = col_type(x4, y4, z4, w4); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(vec<4, V1, Q> const& v1, vec<4, V2, Q> const& v2, vec<4, V3, Q> const& v3, vec<4, V4, Q> const& v4) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2), col_type(v3), col_type(v4)} +# endif + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 4th parameter type invalid."); + +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); + this->value[3] = col_type(v4); +# endif + } + + // -- Matrix conversions -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(0, 0, 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(0, 0, 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(m[2], 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(m[2], 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = col_type(0, 0, 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(0, 0, 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 0), col_type(m[3], 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 0); + this->value[3] = col_type(m[3], 1); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type & mat<4, 4, T, Q>::operator[](typename mat<4, 4, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<4, 4, T, Q>::col_type const& mat<4, 4, T, Q>::operator[](typename mat<4, 4, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary arithmetic operators -- + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator=(mat<4, 4, U, Q> const& m) + { + //memcpy could be faster + //memcpy(&this->value, &m.value, 16 * sizeof(valType)); + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + this->value[3] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator+=(mat<4, 4, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + this->value[3] += m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + this->value[3] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator-=(mat<4, 4, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + this->value[3] -= m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + this->value[3] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator*=(mat<4, 4, U, Q> const& m) + { + return (*this = *this * m); + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + this->value[3] /= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator/=(mat<4, 4, U, Q> const& m) + { + return *this *= inverse(m); + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + ++this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + --this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat<4, 4, T, Q>::operator++(int) + { + mat<4, 4, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat<4, 4, T, Q>::operator--(int) + { + mat<4, 4, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary constant operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + -m[0], + -m[1], + -m[2], + -m[3]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m, T const& s) + { + return mat<4, 4, T, Q>( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(T const& s, mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return mat<4, 4, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2], + m1[3] + m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m, T const& s) + { + return mat<4, 4, T, Q>( + m[0] - s, + m[1] - s, + m[2] - s, + m[3] - s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(T const& s, mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + s - m[0], + s - m[1], + s - m[2], + s - m[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return mat<4, 4, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2], + m1[3] - m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m, T const & s) + { + return mat<4, 4, T, Q>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(T const& s, mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type operator* + ( + mat<4, 4, T, Q> const& m, + typename mat<4, 4, T, Q>::row_type const& v + ) + { +/* + __m128 v0 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 v1 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(1, 1, 1, 1)); + __m128 v2 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 v3 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(m[0].data, v0); + __m128 m1 = _mm_mul_ps(m[1].data, v1); + __m128 a0 = _mm_add_ps(m0, m1); + + __m128 m2 = _mm_mul_ps(m[2].data, v2); + __m128 m3 = _mm_mul_ps(m[3].data, v3); + __m128 a1 = _mm_add_ps(m2, m3); + + __m128 a2 = _mm_add_ps(a0, a1); + + return typename mat<4, 4, T, Q>::col_type(a2); +*/ + + typename mat<4, 4, T, Q>::col_type const Mov0(v[0]); + typename mat<4, 4, T, Q>::col_type const Mov1(v[1]); + typename mat<4, 4, T, Q>::col_type const Mul0 = m[0] * Mov0; + typename mat<4, 4, T, Q>::col_type const Mul1 = m[1] * Mov1; + typename mat<4, 4, T, Q>::col_type const Add0 = Mul0 + Mul1; + typename mat<4, 4, T, Q>::col_type const Mov2(v[2]); + typename mat<4, 4, T, Q>::col_type const Mov3(v[3]); + typename mat<4, 4, T, Q>::col_type const Mul2 = m[2] * Mov2; + typename mat<4, 4, T, Q>::col_type const Mul3 = m[3] * Mov3; + typename mat<4, 4, T, Q>::col_type const Add1 = Mul2 + Mul3; + typename mat<4, 4, T, Q>::col_type const Add2 = Add0 + Add1; + return Add2; + +/* + return typename mat<4, 4, T, Q>::col_type( + m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3], + m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1] * v[3], + m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2] * v[3], + m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3] * v[3]); +*/ + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::row_type operator* + ( + typename mat<4, 4, T, Q>::col_type const& v, + mat<4, 4, T, Q> const& m + ) + { + return typename mat<4, 4, T, Q>::row_type( + m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3], + m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3], + m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3], + m[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return mat<2, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return mat<3, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3], + m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2] + m1[3][3] * m2[2][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + typename mat<4, 4, T, Q>::col_type const SrcA0 = m1[0]; + typename mat<4, 4, T, Q>::col_type const SrcA1 = m1[1]; + typename mat<4, 4, T, Q>::col_type const SrcA2 = m1[2]; + typename mat<4, 4, T, Q>::col_type const SrcA3 = m1[3]; + + typename mat<4, 4, T, Q>::col_type const SrcB0 = m2[0]; + typename mat<4, 4, T, Q>::col_type const SrcB1 = m2[1]; + typename mat<4, 4, T, Q>::col_type const SrcB2 = m2[2]; + typename mat<4, 4, T, Q>::col_type const SrcB3 = m2[3]; + + mat<4, 4, T, Q> Result; + Result[0] = SrcA0 * SrcB0[0] + SrcA1 * SrcB0[1] + SrcA2 * SrcB0[2] + SrcA3 * SrcB0[3]; + Result[1] = SrcA0 * SrcB1[0] + SrcA1 * SrcB1[1] + SrcA2 * SrcB1[2] + SrcA3 * SrcB1[3]; + Result[2] = SrcA0 * SrcB2[0] + SrcA1 * SrcB2[1] + SrcA2 * SrcB2[2] + SrcA3 * SrcB2[3]; + Result[3] = SrcA0 * SrcB3[0] + SrcA1 * SrcB3[1] + SrcA2 * SrcB3[2] + SrcA3 * SrcB3[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m, T const& s) + { + return mat<4, 4, T, Q>( + m[0] / s, + m[1] / s, + m[2] / s, + m[3] / s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(T const& s, mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + s / m[0], + s / m[1], + s / m[2], + s / m[3]); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type operator/(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v) + { + return inverse(m) * v; + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::row_type operator/(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m) + { + return v * inverse(m); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + mat<4, 4, T, Q> m1_copy(m1); + return m1_copy /= m2; + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "type_mat4x4_simd.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/type_mat4x4_simd.inl b/NothinFancy/dep/include/glm/detail/type_mat4x4_simd.inl new file mode 100644 index 0000000..fb3a16f --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_mat4x4_simd.inl @@ -0,0 +1,6 @@ +/// @ref core + +namespace glm +{ + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_quat.hpp b/NothinFancy/dep/include/glm/detail/type_quat.hpp new file mode 100644 index 0000000..0e60bc3 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_quat.hpp @@ -0,0 +1,186 @@ +/// @ref core +/// @file glm/detail/type_quat.hpp + +#pragma once + +// Dependency: +#include "../detail/type_mat3x3.hpp" +#include "../detail/type_mat4x4.hpp" +#include "../detail/type_vec3.hpp" +#include "../detail/type_vec4.hpp" +#include "../ext/vector_relational.hpp" +#include "../ext/quaternion_relational.hpp" +#include "../gtc/constants.hpp" +#include "../gtc/matrix_transform.hpp" + +namespace glm +{ + template + struct qua + { + // -- Implementation detail -- + + typedef qua type; + typedef T value_type; + + // -- Data -- + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +# endif +# endif + +# if GLM_LANG & GLM_LANG_CXXMS_FLAG + union + { +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + struct { T w, x, y, z; }; +# else + struct { T x, y, z, w; }; +# endif + + typename detail::storage<4, T, detail::is_aligned::value>::type data; + }; +# else +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + T w, x, y, z; +# else + T x, y, z, w; +# endif +# endif + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif +# endif + + // -- Component accesses -- + + typedef length_t length_type; + + /// Return the count of components of a quaternion + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;} + + GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR qua() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR qua(qua const& q) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR qua(qua const& q); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR qua(T s, vec<3, T, Q> const& v); + GLM_FUNC_DECL GLM_CONSTEXPR qua(T w, T x, T y, T z); + + // -- Conversion constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT qua(qua const& q); + + /// Explicit conversion operators +# if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS + GLM_FUNC_DECL explicit operator mat<3, 3, T, Q>() const; + GLM_FUNC_DECL explicit operator mat<4, 4, T, Q>() const; +# endif + + /// Create a quaternion from two normalized axis + /// + /// @param u A first normalized axis + /// @param v A second normalized axis + /// @see gtc_quaternion + /// @see http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors + GLM_FUNC_DECL qua(vec<3, T, Q> const& u, vec<3, T, Q> const& v); + + /// Build a quaternion from euler angles (pitch, yaw, roll), in radians. + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT qua(vec<3, T, Q> const& eulerAngles); + GLM_FUNC_DECL GLM_EXPLICIT qua(mat<3, 3, T, Q> const& q); + GLM_FUNC_DECL GLM_EXPLICIT qua(mat<4, 4, T, Q> const& q); + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator=(qua const& q) GLM_DEFAULT; + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator=(qua const& q); + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator+=(qua const& q); + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator-=(qua const& q); + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator*=(qua const& q); + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator*=(U s); + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator/=(U s); + }; + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator+(qua const& q); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator-(qua const& q); + + // -- Binary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator+(qua const& q, qua const& p); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator-(qua const& q, qua const& p); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator*(qua const& q, qua const& p); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(qua const& q, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, qua const& q); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(qua const& q, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, qua const& q); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator*(qua const& q, T const& s); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator*(T const& s, qua const& q); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator/(qua const& q, T const& s); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(qua const& q1, qua const& q2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(qua const& q1, qua const& q2); +} //namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_quat.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/NothinFancy/dep/include/glm/detail/type_quat.inl b/NothinFancy/dep/include/glm/detail/type_quat.inl new file mode 100644 index 0000000..67b9310 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_quat.inl @@ -0,0 +1,408 @@ +#include "../trigonometric.hpp" +#include "../exponential.hpp" +#include "../ext/quaternion_geometric.hpp" +#include + +namespace glm{ +namespace detail +{ + template + struct genTypeTrait > + { + static const genTypeEnum GENTYPE = GENTYPE_QUAT; + }; + + template + struct compute_dot, T, Aligned> + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static T call(qua const& a, qua const& b) + { + vec<4, T, Q> tmp(a.w * b.w, a.x * b.x, a.y * b.y, a.z * b.z); + return (tmp.x + tmp.y) + (tmp.z + tmp.w); + } + }; + + template + struct compute_quat_add + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static qua call(qua const& q, qua const& p) + { + return qua(q.w + p.w, q.x + p.x, q.y + p.y, q.z + p.z); + } + }; + + template + struct compute_quat_sub + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static qua call(qua const& q, qua const& p) + { + return qua(q.w - p.w, q.x - p.x, q.y - p.y, q.z - p.z); + } + }; + + template + struct compute_quat_mul_scalar + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static qua call(qua const& q, T s) + { + return qua(q.w * s, q.x * s, q.y * s, q.z * s); + } + }; + + template + struct compute_quat_div_scalar + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static qua call(qua const& q, T s) + { + return qua(q.w / s, q.x / s, q.y / s, q.z / s); + } + }; + + template + struct compute_quat_mul_vec4 + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(qua const& q, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(q * vec<3, T, Q>(v), v.w); + } + }; +}//namespace detail + + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & qua::operator[](typename qua::length_type i) + { + assert(i >= 0 && i < this->length()); +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + return (&w)[i]; +# else + return (&x)[i]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& qua::operator[](typename qua::length_type i) const + { + assert(i >= 0 && i < this->length()); +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + return (&w)[i]; +# else + return (&x)[i]; +# endif + } + + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua() +# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(1), x(0), y(0), z(0) +# else + : x(0), y(0), z(0), w(1) +# endif +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(qua const& q) +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(q.w), x(q.x), y(q.y), z(q.z) +# else + : x(q.x), y(q.y), z(q.z), w(q.w) +# endif + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(qua const& q) +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(q.w), x(q.x), y(q.y), z(q.z) +# else + : x(q.x), y(q.y), z(q.z), w(q.w) +# endif + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(T s, vec<3, T, Q> const& v) +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(s), x(v.x), y(v.y), z(v.z) +# else + : x(v.x), y(v.y), z(v.z), w(s) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(T _w, T _x, T _y, T _z) +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(_w), x(_x), y(_y), z(_z) +# else + : x(_x), y(_y), z(_z), w(_w) +# endif + {} + + // -- Conversion constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(qua const& q) +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(static_cast(q.w)), x(static_cast(q.x)), y(static_cast(q.y)), z(static_cast(q.z)) +# else + : x(static_cast(q.x)), y(static_cast(q.y)), z(static_cast(q.z)), w(static_cast(q.w)) +# endif + {} + + //template + //GLM_FUNC_QUALIFIER qua::qua + //( + // valType const& pitch, + // valType const& yaw, + // valType const& roll + //) + //{ + // vec<3, valType> eulerAngle(pitch * valType(0.5), yaw * valType(0.5), roll * valType(0.5)); + // vec<3, valType> c = glm::cos(eulerAngle * valType(0.5)); + // vec<3, valType> s = glm::sin(eulerAngle * valType(0.5)); + // + // this->w = c.x * c.y * c.z + s.x * s.y * s.z; + // this->x = s.x * c.y * c.z - c.x * s.y * s.z; + // this->y = c.x * s.y * c.z + s.x * c.y * s.z; + // this->z = c.x * c.y * s.z - s.x * s.y * c.z; + //} + + template + GLM_FUNC_QUALIFIER qua::qua(vec<3, T, Q> const& u, vec<3, T, Q> const& v) + { + T norm_u_norm_v = sqrt(dot(u, u) * dot(v, v)); + T real_part = norm_u_norm_v + dot(u, v); + vec<3, T, Q> t; + + if(real_part < static_cast(1.e-6f) * norm_u_norm_v) + { + // If u and v are exactly opposite, rotate 180 degrees + // around an arbitrary orthogonal axis. Axis normalisation + // can happen later, when we normalise the quaternion. + real_part = static_cast(0); + t = abs(u.x) > abs(u.z) ? vec<3, T, Q>(-u.y, u.x, static_cast(0)) : vec<3, T, Q>(static_cast(0), -u.z, u.y); + } + else + { + // Otherwise, build quaternion the standard way. + t = cross(u, v); + } + + *this = normalize(qua(real_part, t.x, t.y, t.z)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(vec<3, T, Q> const& eulerAngle) + { + vec<3, T, Q> c = glm::cos(eulerAngle * T(0.5)); + vec<3, T, Q> s = glm::sin(eulerAngle * T(0.5)); + + this->w = c.x * c.y * c.z + s.x * s.y * s.z; + this->x = s.x * c.y * c.z - c.x * s.y * s.z; + this->y = c.x * s.y * c.z + s.x * c.y * s.z; + this->z = c.x * c.y * s.z - s.x * s.y * c.z; + } + + template + GLM_FUNC_QUALIFIER qua::qua(mat<3, 3, T, Q> const& m) + { + *this = quat_cast(m); + } + + template + GLM_FUNC_QUALIFIER qua::qua(mat<4, 4, T, Q> const& m) + { + *this = quat_cast(m); + } + +# if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS + template + GLM_FUNC_QUALIFIER qua::operator mat<3, 3, T, Q>() const + { + return mat3_cast(*this); + } + + template + GLM_FUNC_QUALIFIER qua::operator mat<4, 4, T, Q>() const + { + return mat4_cast(*this); + } +# endif//GLM_HAS_EXPLICIT_CONVERSION_OPERATORS + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator=(qua const& q) + { + this->w = q.w; + this->x = q.x; + this->y = q.y; + this->z = q.z; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator=(qua const& q) + { + this->w = static_cast(q.w); + this->x = static_cast(q.x); + this->y = static_cast(q.y); + this->z = static_cast(q.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator+=(qua const& q) + { + return (*this = detail::compute_quat_add::value>::call(*this, qua(q))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator-=(qua const& q) + { + return (*this = detail::compute_quat_sub::value>::call(*this, qua(q))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator*=(qua const& r) + { + qua const p(*this); + qua const q(r); + + this->w = p.w * q.w - p.x * q.x - p.y * q.y - p.z * q.z; + this->x = p.w * q.x + p.x * q.w + p.y * q.z - p.z * q.y; + this->y = p.w * q.y + p.y * q.w + p.z * q.x - p.x * q.z; + this->z = p.w * q.z + p.z * q.w + p.x * q.y - p.y * q.x; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator*=(U s) + { + return (*this = detail::compute_quat_mul_scalar::value>::call(*this, static_cast(s))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator/=(U s) + { + return (*this = detail::compute_quat_div_scalar::value>::call(*this, static_cast(s))); + } + + // -- Unary bit operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator+(qua const& q) + { + return q; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator-(qua const& q) + { + return qua(-q.w, -q.x, -q.y, -q.z); + } + + // -- Binary operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator+(qua const& q, qua const& p) + { + return qua(q) += p; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator-(qua const& q, qua const& p) + { + return qua(q) -= p; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator*(qua const& q, qua const& p) + { + return qua(q) *= p; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(qua const& q, vec<3, T, Q> const& v) + { + vec<3, T, Q> const QuatVector(q.x, q.y, q.z); + vec<3, T, Q> const uv(glm::cross(QuatVector, v)); + vec<3, T, Q> const uuv(glm::cross(QuatVector, uv)); + + return v + ((uv * q.w) + uuv) * static_cast(2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, qua const& q) + { + return glm::inverse(q) * v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(qua const& q, vec<4, T, Q> const& v) + { + return detail::compute_quat_mul_vec4::value>::call(q, v); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, qua const& q) + { + return glm::inverse(q) * v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator*(qua const& q, T const& s) + { + return qua( + q.w * s, q.x * s, q.y * s, q.z * s); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator*(T const& s, qua const& q) + { + return q * s; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator/(qua const& q, T const& s) + { + return qua( + q.w / s, q.x / s, q.y / s, q.z / s); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(qua const& q1, qua const& q2) + { + return q1.x == q2.x && q1.y == q2.y && q1.z == q2.z && q1.w == q2.w; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(qua const& q1, qua const& q2) + { + return q1.x != q2.x || q1.y != q2.y || q1.z != q2.z || q1.w != q2.w; + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "type_quat_simd.inl" +#endif + diff --git a/NothinFancy/dep/include/glm/detail/type_quat_simd.inl b/NothinFancy/dep/include/glm/detail/type_quat_simd.inl new file mode 100644 index 0000000..3333e59 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_quat_simd.inl @@ -0,0 +1,188 @@ +/// @ref core + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ +/* + template + struct compute_quat_mul + { + static qua call(qua const& q1, qua const& q2) + { + // SSE2 STATS: 11 shuffle, 8 mul, 8 add + // SSE4 STATS: 3 shuffle, 4 mul, 4 dpps + + __m128 const mul0 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(0, 1, 2, 3))); + __m128 const mul1 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(1, 0, 3, 2))); + __m128 const mul2 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(2, 3, 0, 1))); + __m128 const mul3 = _mm_mul_ps(q1.Data, q2.Data); + +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + __m128 const add0 = _mm_dp_ps(mul0, _mm_set_ps(1.0f, -1.0f, 1.0f, 1.0f), 0xff); + __m128 const add1 = _mm_dp_ps(mul1, _mm_set_ps(1.0f, 1.0f, 1.0f, -1.0f), 0xff); + __m128 const add2 = _mm_dp_ps(mul2, _mm_set_ps(1.0f, 1.0f, -1.0f, 1.0f), 0xff); + __m128 const add3 = _mm_dp_ps(mul3, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f), 0xff); +# else + __m128 const mul4 = _mm_mul_ps(mul0, _mm_set_ps(1.0f, -1.0f, 1.0f, 1.0f)); + __m128 const add0 = _mm_add_ps(mul0, _mm_movehl_ps(mul4, mul4)); + __m128 const add4 = _mm_add_ss(add0, _mm_shuffle_ps(add0, add0, 1)); + + __m128 const mul5 = _mm_mul_ps(mul1, _mm_set_ps(1.0f, 1.0f, 1.0f, -1.0f)); + __m128 const add1 = _mm_add_ps(mul1, _mm_movehl_ps(mul5, mul5)); + __m128 const add5 = _mm_add_ss(add1, _mm_shuffle_ps(add1, add1, 1)); + + __m128 const mul6 = _mm_mul_ps(mul2, _mm_set_ps(1.0f, 1.0f, -1.0f, 1.0f)); + __m128 const add2 = _mm_add_ps(mul6, _mm_movehl_ps(mul6, mul6)); + __m128 const add6 = _mm_add_ss(add2, _mm_shuffle_ps(add2, add2, 1)); + + __m128 const mul7 = _mm_mul_ps(mul3, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f)); + __m128 const add3 = _mm_add_ps(mul3, _mm_movehl_ps(mul7, mul7)); + __m128 const add7 = _mm_add_ss(add3, _mm_shuffle_ps(add3, add3, 1)); + #endif + + // This SIMD code is a politically correct way of doing this, but in every test I've tried it has been slower than + // the final code below. I'll keep this here for reference - maybe somebody else can do something better... + // + //__m128 xxyy = _mm_shuffle_ps(add4, add5, _MM_SHUFFLE(0, 0, 0, 0)); + //__m128 zzww = _mm_shuffle_ps(add6, add7, _MM_SHUFFLE(0, 0, 0, 0)); + // + //return _mm_shuffle_ps(xxyy, zzww, _MM_SHUFFLE(2, 0, 2, 0)); + + qua Result; + _mm_store_ss(&Result.x, add4); + _mm_store_ss(&Result.y, add5); + _mm_store_ss(&Result.z, add6); + _mm_store_ss(&Result.w, add7); + return Result; + } + }; +*/ + + template + struct compute_quat_add + { + static qua call(qua const& q, qua const& p) + { + qua Result; + Result.data = _mm_add_ps(q.data, p.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_quat_add + { + static qua call(qua const& a, qua const& b) + { + qua Result; + Result.data = _mm256_add_pd(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_quat_sub + { + static qua call(qua const& q, qua const& p) + { + vec<4, float, Q> Result; + Result.data = _mm_sub_ps(q.data, p.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_quat_sub + { + static qua call(qua const& a, qua const& b) + { + qua Result; + Result.data = _mm256_sub_pd(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_quat_mul_scalar + { + static qua call(qua const& q, float s) + { + vec<4, float, Q> Result; + Result.data = _mm_mul_ps(q.data, _mm_set_ps1(s)); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_quat_mul_scalar + { + static qua call(qua const& q, double s) + { + qua Result; + Result.data = _mm256_mul_pd(q.data, _mm_set_ps1(s)); + return Result; + } + }; +# endif + + template + struct compute_quat_div_scalar + { + static qua call(qua const& q, float s) + { + vec<4, float, Q> Result; + Result.data = _mm_div_ps(q.data, _mm_set_ps1(s)); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_quat_div_scalar + { + static qua call(qua const& q, double s) + { + qua Result; + Result.data = _mm256_div_pd(q.data, _mm_set_ps1(s)); + return Result; + } + }; +# endif + + template + struct compute_quat_mul_vec4 + { + static vec<4, float, Q> call(qua const& q, vec<4, float, Q> const& v) + { + __m128 const q_wwww = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 const q_swp0 = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 0, 2, 1)); + __m128 const q_swp1 = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 1, 0, 2)); + __m128 const v_swp0 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 0, 2, 1)); + __m128 const v_swp1 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 1, 0, 2)); + + __m128 uv = _mm_sub_ps(_mm_mul_ps(q_swp0, v_swp1), _mm_mul_ps(q_swp1, v_swp0)); + __m128 uv_swp0 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 0, 2, 1)); + __m128 uv_swp1 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 1, 0, 2)); + __m128 uuv = _mm_sub_ps(_mm_mul_ps(q_swp0, uv_swp1), _mm_mul_ps(q_swp1, uv_swp0)); + + __m128 const two = _mm_set1_ps(2.0f); + uv = _mm_mul_ps(uv, _mm_mul_ps(q_wwww, two)); + uuv = _mm_mul_ps(uuv, two); + + vec<4, float, Q> Result; + Result.data = _mm_add_ps(v.Data, _mm_add_ps(uv, uuv)); + return Result; + } + }; +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT + diff --git a/NothinFancy/dep/include/glm/detail/type_vec1.hpp b/NothinFancy/dep/include/glm/detail/type_vec1.hpp new file mode 100644 index 0000000..51163f1 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_vec1.hpp @@ -0,0 +1,308 @@ +/// @ref core +/// @file glm/detail/type_vec1.hpp + +#pragma once + +#include "qualifier.hpp" +#if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +# include "_swizzle.hpp" +#elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION +# include "_swizzle_func.hpp" +#endif +#include + +namespace glm +{ + template + struct vec<1, T, Q> + { + // -- Implementation detail -- + + typedef T value_type; + typedef vec<1, T, Q> type; + typedef vec<1, bool, Q> bool_type; + + // -- Data -- + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +# endif +# endif + +# if GLM_CONFIG_XYZW_ONLY + T x; +# elif GLM_CONFIG_ANONYMOUS_STRUCT == GLM_ENABLE + union + { + T x; + T r; + T s; + + typename detail::storage<1, T, detail::is_aligned::value>::type data; +/* +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + _GLM_SWIZZLE1_2_MEMBERS(T, Q, x) + _GLM_SWIZZLE1_2_MEMBERS(T, Q, r) + _GLM_SWIZZLE1_2_MEMBERS(T, Q, s) + _GLM_SWIZZLE1_3_MEMBERS(T, Q, x) + _GLM_SWIZZLE1_3_MEMBERS(T, Q, r) + _GLM_SWIZZLE1_3_MEMBERS(T, Q, s) + _GLM_SWIZZLE1_4_MEMBERS(T, Q, x) + _GLM_SWIZZLE1_4_MEMBERS(T, Q, r) + _GLM_SWIZZLE1_4_MEMBERS(T, Q, s) +# endif +*/ + }; +# else + union {T x, r, s;}; +/* +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION + GLM_SWIZZLE_GEN_VEC_FROM_VEC1(T, Q) +# endif +*/ +# endif + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif +# endif + + // -- Component accesses -- + + /// Return the count of components of the vector + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 1;} + + GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec const& v) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, T, P> const& v); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(T scalar); + + // -- Conversion vector constructors -- + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<2, U, P> const& v); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<3, U, P> const& v); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<4, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<1, U, P> const& v); + + // -- Swizzle constructors -- +/* +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<1, T, Q, E0, -1,-2,-3> const& that) + { + *this = that(); + } +# endif//GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +*/ + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator=(vec const& v) GLM_DEFAULT; + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator+=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator+=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator-=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator-=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator*=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator*=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator/=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator/=(vec<1, U, Q> const& v); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator++(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator--(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator++(int); + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator--(int); + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator%=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator%=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator&=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator&=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator|=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator|=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator^=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator^=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator<<=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator<<=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator>>=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator>>=(vec<1, U, Q> const& v); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v); + + // -- Binary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator~(vec<1, T, Q> const& v); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec1.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/NothinFancy/dep/include/glm/detail/type_vec1.inl b/NothinFancy/dep/include/glm/detail/type_vec1.inl new file mode 100644 index 0000000..c5883ce --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_vec1.inl @@ -0,0 +1,551 @@ +/// @ref core + +#include "./compute_vector_relational.hpp" + +namespace glm +{ + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec() +# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE + : x(0) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, T, Q> const& v) + : x(v.x) + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, T, P> const& v) + : x(v.x) + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(T scalar) + : x(scalar) + {} + + // -- Conversion vector constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, U, P> const& v) + : x(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<2, U, P> const& v) + : x(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<3, U, P> const& v) + : x(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<4, U, P> const& v) + : x(static_cast(v.x)) + {} + + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type) + { + return x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type) const + { + return x; + } + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, T, Q> const& v) + { + this->x = v.x; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, U, Q> const& v) + { + this->x = static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator+=(U scalar) + { + this->x += static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator+=(vec<1, U, Q> const& v) + { + this->x += static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator-=(U scalar) + { + this->x -= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator-=(vec<1, U, Q> const& v) + { + this->x -= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator*=(U scalar) + { + this->x *= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator*=(vec<1, U, Q> const& v) + { + this->x *= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator/=(U scalar) + { + this->x /= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator/=(vec<1, U, Q> const& v) + { + this->x /= static_cast(v.x); + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator++() + { + ++this->x; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator--() + { + --this->x; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> vec<1, T, Q>::operator++(int) + { + vec<1, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> vec<1, T, Q>::operator--(int) + { + vec<1, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary bit operators -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator%=(U scalar) + { + this->x %= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator%=(vec<1, U, Q> const& v) + { + this->x %= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator&=(U scalar) + { + this->x &= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator&=(vec<1, U, Q> const& v) + { + this->x &= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator|=(U scalar) + { + this->x |= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator|=(vec<1, U, Q> const& v) + { + this->x |= U(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator^=(U scalar) + { + this->x ^= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator^=(vec<1, U, Q> const& v) + { + this->x ^= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator<<=(U scalar) + { + this->x <<= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator<<=(vec<1, U, Q> const& v) + { + this->x <<= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator>>=(U scalar) + { + this->x >>= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator>>=(vec<1, U, Q> const& v) + { + this->x >>= static_cast(v.x); + return *this; + } + + // -- Unary constant operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v) + { + return v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + -v.x); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x + scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar + v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x + v2.x); + } + + //operator- + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x - scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar - v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x - v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x * scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar * v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x * v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x / scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar / v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x / v2.x); + } + + // -- Binary bit operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x % scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar % v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x % v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x & scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar & v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x & v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x | scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar | v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x | v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x ^ scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar ^ v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x ^ v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + static_cast(v.x << scalar)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + static_cast(scalar << v.x)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + static_cast(v1.x << v2.x)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + static_cast(v.x >> scalar)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + static_cast(scalar >> v.x)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + static_cast(v1.x >> v2.x)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator~(vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + ~v.x); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return detail::compute_equal::is_iec559>::call(v1.x, v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return !(v1 == v2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2) + { + return vec<1, bool, Q>(v1.x && v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2) + { + return vec<1, bool, Q>(v1.x || v2.x); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_vec2.hpp b/NothinFancy/dep/include/glm/detail/type_vec2.hpp new file mode 100644 index 0000000..52ef408 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_vec2.hpp @@ -0,0 +1,399 @@ +/// @ref core +/// @file glm/detail/type_vec2.hpp + +#pragma once + +#include "qualifier.hpp" +#if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +# include "_swizzle.hpp" +#elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION +# include "_swizzle_func.hpp" +#endif +#include + +namespace glm +{ + template + struct vec<2, T, Q> + { + // -- Implementation detail -- + + typedef T value_type; + typedef vec<2, T, Q> type; + typedef vec<2, bool, Q> bool_type; + + // -- Data -- + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +# endif +# endif + +# if GLM_CONFIG_XYZW_ONLY + T x, y; +# elif GLM_CONFIG_ANONYMOUS_STRUCT == GLM_ENABLE + union + { + struct{ T x, y; }; + struct{ T r, g; }; + struct{ T s, t; }; + + typename detail::storage<2, T, detail::is_aligned::value>::type data; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + GLM_SWIZZLE2_2_MEMBERS(T, Q, x, y) + GLM_SWIZZLE2_2_MEMBERS(T, Q, r, g) + GLM_SWIZZLE2_2_MEMBERS(T, Q, s, t) + GLM_SWIZZLE2_3_MEMBERS(T, Q, x, y) + GLM_SWIZZLE2_3_MEMBERS(T, Q, r, g) + GLM_SWIZZLE2_3_MEMBERS(T, Q, s, t) + GLM_SWIZZLE2_4_MEMBERS(T, Q, x, y) + GLM_SWIZZLE2_4_MEMBERS(T, Q, r, g) + GLM_SWIZZLE2_4_MEMBERS(T, Q, s, t) +# endif + }; +# else + union {T x, r, s;}; + union {T y, g, t;}; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION + GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, Q) +# endif//GLM_CONFIG_SWIZZLE +# endif + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif +# endif + + // -- Component accesses -- + + /// Return the count of components of the vector + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 2;} + + GLM_FUNC_DECL GLM_CONSTEXPR T& operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec const& v) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, T, P> const& v); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR vec(T x, T y); + + // -- Conversion constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(vec<1, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A x, B y); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, Q> const& x, B y); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A x, vec<1, B, Q> const& y); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, Q> const& x, vec<1, B, Q> const& y); + + // -- Conversion vector constructors -- + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<3, U, P> const& v); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<4, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<2, U, P> const& v); + + // -- Swizzle constructors -- +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1,-1,-2> const& that) + { + *this = that(); + } +# endif//GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator=(vec const& v) GLM_DEFAULT; + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator+=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator+=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator+=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator-=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator-=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator-=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator*=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator*=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator*=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator/=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator/=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator/=(vec<2, U, Q> const& v); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator++(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator--(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator++(int); + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator--(int); + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator%=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator%=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator%=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator&=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator&=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator&=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator|=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator|=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator|=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator^=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator^=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator^=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator<<=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator<<=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator<<=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator>>=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator>>=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator>>=(vec<2, U, Q> const& v); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v); + + // -- Binary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator*(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator*(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator/(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator/(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator%(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator%(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator&(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator&(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator|(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator|(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator^(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator^(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator<<(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator>>(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator~(vec<2, T, Q> const& v); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, bool, Q> operator&&(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, bool, Q> operator||(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec2.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/NothinFancy/dep/include/glm/detail/type_vec2.inl b/NothinFancy/dep/include/glm/detail/type_vec2.inl new file mode 100644 index 0000000..8e65d6b --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_vec2.inl @@ -0,0 +1,913 @@ +/// @ref core + +#include "./compute_vector_relational.hpp" + +namespace glm +{ + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec() +# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE + : x(0), y(0) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<2, T, Q> const& v) + : x(v.x), y(v.y) + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<2, T, P> const& v) + : x(v.x), y(v.y) + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(T scalar) + : x(scalar), y(scalar) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(T _x, T _y) + : x(_x), y(_y) + {} + + // -- Conversion scalar constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<1, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(A _x, B _y) + : x(static_cast(_x)) + , y(static_cast(_y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<1, A, Q> const& _x, B _y) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(A _x, vec<1, B, Q> const& _y) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<1, A, Q> const& _x, vec<1, B, Q> const& _y) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + {} + + // -- Conversion vector constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<2, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<3, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<4, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + {} + + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<2, T, Q>::operator[](typename vec<2, T, Q>::length_type i) + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + } + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<2, T, Q>::operator[](typename vec<2, T, Q>::length_type i) const + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + } + } + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator=(vec<2, T, Q> const& v) + { + this->x = v.x; + this->y = v.y; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator=(vec<2, U, Q> const& v) + { + this->x = static_cast(v.x); + this->y = static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator+=(U scalar) + { + this->x += static_cast(scalar); + this->y += static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator+=(vec<1, U, Q> const& v) + { + this->x += static_cast(v.x); + this->y += static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator+=(vec<2, U, Q> const& v) + { + this->x += static_cast(v.x); + this->y += static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator-=(U scalar) + { + this->x -= static_cast(scalar); + this->y -= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator-=(vec<1, U, Q> const& v) + { + this->x -= static_cast(v.x); + this->y -= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator-=(vec<2, U, Q> const& v) + { + this->x -= static_cast(v.x); + this->y -= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator*=(U scalar) + { + this->x *= static_cast(scalar); + this->y *= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator*=(vec<1, U, Q> const& v) + { + this->x *= static_cast(v.x); + this->y *= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator*=(vec<2, U, Q> const& v) + { + this->x *= static_cast(v.x); + this->y *= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator/=(U scalar) + { + this->x /= static_cast(scalar); + this->y /= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator/=(vec<1, U, Q> const& v) + { + this->x /= static_cast(v.x); + this->y /= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator/=(vec<2, U, Q> const& v) + { + this->x /= static_cast(v.x); + this->y /= static_cast(v.y); + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator++() + { + ++this->x; + ++this->y; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator--() + { + --this->x; + --this->y; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> vec<2, T, Q>::operator++(int) + { + vec<2, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> vec<2, T, Q>::operator--(int) + { + vec<2, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary bit operators -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator%=(U scalar) + { + this->x %= static_cast(scalar); + this->y %= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator%=(vec<1, U, Q> const& v) + { + this->x %= static_cast(v.x); + this->y %= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator%=(vec<2, U, Q> const& v) + { + this->x %= static_cast(v.x); + this->y %= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator&=(U scalar) + { + this->x &= static_cast(scalar); + this->y &= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator&=(vec<1, U, Q> const& v) + { + this->x &= static_cast(v.x); + this->y &= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator&=(vec<2, U, Q> const& v) + { + this->x &= static_cast(v.x); + this->y &= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator|=(U scalar) + { + this->x |= static_cast(scalar); + this->y |= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator|=(vec<1, U, Q> const& v) + { + this->x |= static_cast(v.x); + this->y |= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator|=(vec<2, U, Q> const& v) + { + this->x |= static_cast(v.x); + this->y |= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator^=(U scalar) + { + this->x ^= static_cast(scalar); + this->y ^= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator^=(vec<1, U, Q> const& v) + { + this->x ^= static_cast(v.x); + this->y ^= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator^=(vec<2, U, Q> const& v) + { + this->x ^= static_cast(v.x); + this->y ^= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator<<=(U scalar) + { + this->x <<= static_cast(scalar); + this->y <<= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator<<=(vec<1, U, Q> const& v) + { + this->x <<= static_cast(v.x); + this->y <<= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator<<=(vec<2, U, Q> const& v) + { + this->x <<= static_cast(v.x); + this->y <<= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator>>=(U scalar) + { + this->x >>= static_cast(scalar); + this->y >>= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator>>=(vec<1, U, Q> const& v) + { + this->x >>= static_cast(v.x); + this->y >>= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator>>=(vec<2, U, Q> const& v) + { + this->x >>= static_cast(v.x); + this->y >>= static_cast(v.y); + return *this; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v) + { + return v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + -v.x, + -v.y); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x + scalar, + v.y + scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x + v2.x, + v1.y + v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar + v.x, + scalar + v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x + v2.x, + v1.x + v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x + v2.x, + v1.y + v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x - scalar, + v.y - scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x - v2.x, + v1.y - v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar - v.x, + scalar - v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x - v2.x, + v1.x - v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x - v2.x, + v1.y - v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x * scalar, + v.y * scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x * v2.x, + v1.y * v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar * v.x, + scalar * v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x * v2.x, + v1.x * v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x * v2.x, + v1.y * v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x / scalar, + v.y / scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x / v2.x, + v1.y / v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar / v.x, + scalar / v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x / v2.x, + v1.x / v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x / v2.x, + v1.y / v2.y); + } + + // -- Binary bit operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x % scalar, + v.y % scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x % v2.x, + v1.y % v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar % v.x, + scalar % v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x % v2.x, + v1.x % v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x % v2.x, + v1.y % v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x & scalar, + v.y & scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x & v2.x, + v1.y & v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar & v.x, + scalar & v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x & v2.x, + v1.x & v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x & v2.x, + v1.y & v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x | scalar, + v.y | scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x | v2.x, + v1.y | v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar | v.x, + scalar | v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x | v2.x, + v1.x | v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x | v2.x, + v1.y | v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x ^ scalar, + v.y ^ scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x ^ v2.x, + v1.y ^ v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar ^ v.x, + scalar ^ v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x ^ v2.x, + v1.x ^ v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x ^ v2.x, + v1.y ^ v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x << scalar, + v.y << scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x << v2.x, + v1.y << v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar << v.x, + scalar << v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x << v2.x, + v1.x << v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x << v2.x, + v1.y << v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x >> scalar, + v.y >> scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x >> v2.x, + v1.y >> v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar >> v.x, + scalar >> v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x >> v2.x, + v1.x >> v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x >> v2.x, + v1.y >> v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator~(vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + ~v.x, + ~v.y); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return + detail::compute_equal::is_iec559>::call(v1.x, v2.x) && + detail::compute_equal::is_iec559>::call(v1.y, v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return !(v1 == v2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, bool, Q> operator&&(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2) + { + return vec<2, bool, Q>(v1.x && v2.x, v1.y && v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, bool, Q> operator||(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2) + { + return vec<2, bool, Q>(v1.x || v2.x, v1.y || v2.y); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_vec3.hpp b/NothinFancy/dep/include/glm/detail/type_vec3.hpp new file mode 100644 index 0000000..d83cde6 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_vec3.hpp @@ -0,0 +1,432 @@ +/// @ref core +/// @file glm/detail/type_vec3.hpp + +#pragma once + +#include "qualifier.hpp" +#if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +# include "_swizzle.hpp" +#elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION +# include "_swizzle_func.hpp" +#endif +#include + +namespace glm +{ + template + struct vec<3, T, Q> + { + // -- Implementation detail -- + + typedef T value_type; + typedef vec<3, T, Q> type; + typedef vec<3, bool, Q> bool_type; + + // -- Data -- + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE +# pragma warning(disable: 4324) // structure was padded due to alignment specifier +# endif +# endif +# endif + +# if GLM_CONFIG_XYZW_ONLY + T x, y, z; +# elif GLM_CONFIG_ANONYMOUS_STRUCT == GLM_ENABLE + union + { + struct{ T x, y, z; }; + struct{ T r, g, b; }; + struct{ T s, t, p; }; + + typename detail::storage<3, T, detail::is_aligned::value>::type data; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + GLM_SWIZZLE3_2_MEMBERS(T, Q, x, y, z) + GLM_SWIZZLE3_2_MEMBERS(T, Q, r, g, b) + GLM_SWIZZLE3_2_MEMBERS(T, Q, s, t, p) + GLM_SWIZZLE3_3_MEMBERS(T, Q, x, y, z) + GLM_SWIZZLE3_3_MEMBERS(T, Q, r, g, b) + GLM_SWIZZLE3_3_MEMBERS(T, Q, s, t, p) + GLM_SWIZZLE3_4_MEMBERS(T, Q, x, y, z) + GLM_SWIZZLE3_4_MEMBERS(T, Q, r, g, b) + GLM_SWIZZLE3_4_MEMBERS(T, Q, s, t, p) +# endif + }; +# else + union { T x, r, s; }; + union { T y, g, t; }; + union { T z, b, p; }; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION + GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, Q) +# endif//GLM_CONFIG_SWIZZLE +# endif//GLM_LANG + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif +# endif + + // -- Component accesses -- + + /// Return the count of components of the vector + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 3;} + + GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec const& v) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<3, T, P> const& v); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR vec(T a, T b, T c); + + // -- Conversion scalar constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(vec<1, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X x, Y y, Z z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, Z _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, Z _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, vec<1, Z, Q> const& _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z); + + // -- Conversion vector constructors -- + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, B _z); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<2, B, P> const& _yz); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<4, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<3, U, P> const& v); + + // -- Swizzle constructors -- +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& that) + { + *this = that(); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& scalar) + { + *this = vec(v(), scalar); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& scalar, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v) + { + *this = vec(scalar, v()); + } +# endif//GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q>& operator=(vec<3, T, Q> const& v) GLM_DEFAULT; + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator+=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator+=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator+=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator-=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator-=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator-=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator*=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator*=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator*=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator/=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator/=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator/=(vec<3, U, Q> const& v); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator++(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator--(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator++(int); + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator--(int); + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator%=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator%=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator%=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator&=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator&=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator&=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator|=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator|=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator|=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator^=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator^=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator^=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator<<=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator<<=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator<<=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator>>=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator>>=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator>>=(vec<3, U, Q> const& v); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v); + + // -- Binary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator/(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator/(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator%(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator%(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v1, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator&(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator&(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator|(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator|(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator^(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator^(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator<<(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator>>(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator~(vec<3, T, Q> const& v); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, bool, Q> operator&&(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, bool, Q> operator||(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec3.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/NothinFancy/dep/include/glm/detail/type_vec3.inl b/NothinFancy/dep/include/glm/detail/type_vec3.inl new file mode 100644 index 0000000..6532c9e --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_vec3.inl @@ -0,0 +1,1068 @@ +/// @ref core + +#include "compute_vector_relational.hpp" + +namespace glm +{ + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec() +# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE + : x(0), y(0), z(0) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, T, Q> const& v) + : x(v.x), y(v.y), z(v.z) + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, T, P> const& v) + : x(v.x), y(v.y), z(v.z) + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(T scalar) + : x(scalar), y(scalar), z(scalar) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(T _x, T _y, T _z) + : x(_x), y(_y), z(_z) + {} + + // -- Conversion scalar constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.x)) + , z(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, Y _y, Z _z) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, Z _z) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, Z _z) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, Y _y, vec<1, Z, Q> const& _z) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + {} + + // -- Conversion vector constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, B _z) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(A _x, vec<2, B, P> const& _yz) + : x(static_cast(_x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz) + : x(static_cast(_x.x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + , z(static_cast(v.z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<4, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + , z(static_cast(v.z)) + {} + + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i) + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + case 2: + return z; + } + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i) const + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + case 2: + return z; + } + } + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, T, Q> const& v) + { + this->x = v.x; + this->y = v.y; + this->z = v.z; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, U, Q> const& v) + { + this->x = static_cast(v.x); + this->y = static_cast(v.y); + this->z = static_cast(v.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(U scalar) + { + this->x += static_cast(scalar); + this->y += static_cast(scalar); + this->z += static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<1, U, Q> const& v) + { + this->x += static_cast(v.x); + this->y += static_cast(v.x); + this->z += static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<3, U, Q> const& v) + { + this->x += static_cast(v.x); + this->y += static_cast(v.y); + this->z += static_cast(v.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(U scalar) + { + this->x -= static_cast(scalar); + this->y -= static_cast(scalar); + this->z -= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<1, U, Q> const& v) + { + this->x -= static_cast(v.x); + this->y -= static_cast(v.x); + this->z -= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<3, U, Q> const& v) + { + this->x -= static_cast(v.x); + this->y -= static_cast(v.y); + this->z -= static_cast(v.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(U scalar) + { + this->x *= static_cast(scalar); + this->y *= static_cast(scalar); + this->z *= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<1, U, Q> const& v) + { + this->x *= static_cast(v.x); + this->y *= static_cast(v.x); + this->z *= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<3, U, Q> const& v) + { + this->x *= static_cast(v.x); + this->y *= static_cast(v.y); + this->z *= static_cast(v.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(U v) + { + this->x /= static_cast(v); + this->y /= static_cast(v); + this->z /= static_cast(v); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<1, U, Q> const& v) + { + this->x /= static_cast(v.x); + this->y /= static_cast(v.x); + this->z /= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<3, U, Q> const& v) + { + this->x /= static_cast(v.x); + this->y /= static_cast(v.y); + this->z /= static_cast(v.z); + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator++() + { + ++this->x; + ++this->y; + ++this->z; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator--() + { + --this->x; + --this->y; + --this->z; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> vec<3, T, Q>::operator++(int) + { + vec<3, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> vec<3, T, Q>::operator--(int) + { + vec<3, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary bit operators -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(U scalar) + { + this->x %= scalar; + this->y %= scalar; + this->z %= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<1, U, Q> const& v) + { + this->x %= v.x; + this->y %= v.x; + this->z %= v.x; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<3, U, Q> const& v) + { + this->x %= v.x; + this->y %= v.y; + this->z %= v.z; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(U scalar) + { + this->x &= scalar; + this->y &= scalar; + this->z &= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<1, U, Q> const& v) + { + this->x &= v.x; + this->y &= v.x; + this->z &= v.x; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<3, U, Q> const& v) + { + this->x &= v.x; + this->y &= v.y; + this->z &= v.z; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(U scalar) + { + this->x |= scalar; + this->y |= scalar; + this->z |= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<1, U, Q> const& v) + { + this->x |= v.x; + this->y |= v.x; + this->z |= v.x; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<3, U, Q> const& v) + { + this->x |= v.x; + this->y |= v.y; + this->z |= v.z; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(U scalar) + { + this->x ^= scalar; + this->y ^= scalar; + this->z ^= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<1, U, Q> const& v) + { + this->x ^= v.x; + this->y ^= v.x; + this->z ^= v.x; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<3, U, Q> const& v) + { + this->x ^= v.x; + this->y ^= v.y; + this->z ^= v.z; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(U scalar) + { + this->x <<= scalar; + this->y <<= scalar; + this->z <<= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<1, U, Q> const& v) + { + this->x <<= static_cast(v.x); + this->y <<= static_cast(v.x); + this->z <<= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<3, U, Q> const& v) + { + this->x <<= static_cast(v.x); + this->y <<= static_cast(v.y); + this->z <<= static_cast(v.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(U scalar) + { + this->x >>= static_cast(scalar); + this->y >>= static_cast(scalar); + this->z >>= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<1, U, Q> const& v) + { + this->x >>= static_cast(v.x); + this->y >>= static_cast(v.x); + this->z >>= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<3, U, Q> const& v) + { + this->x >>= static_cast(v.x); + this->y >>= static_cast(v.y); + this->z >>= static_cast(v.z); + return *this; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v) + { + return v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + -v.x, + -v.y, + -v.z); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x + scalar, + v.y + scalar, + v.z + scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x + scalar.x, + v.y + scalar.x, + v.z + scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar + v.x, + scalar + v.y, + scalar + v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x + v.x, + scalar.x + v.y, + scalar.x + v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x + v2.x, + v1.y + v2.y, + v1.z + v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x - scalar, + v.y - scalar, + v.z - scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x - scalar.x, + v.y - scalar.x, + v.z - scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar - v.x, + scalar - v.y, + scalar - v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x - v.x, + scalar.x - v.y, + scalar.x - v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x - v2.x, + v1.y - v2.y, + v1.z - v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x * scalar, + v.y * scalar, + v.z * scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x * scalar.x, + v.y * scalar.x, + v.z * scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar * v.x, + scalar * v.y, + scalar * v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x * v.x, + scalar.x * v.y, + scalar.x * v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x * v2.x, + v1.y * v2.y, + v1.z * v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x / scalar, + v.y / scalar, + v.z / scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x / scalar.x, + v.y / scalar.x, + v.z / scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar / v.x, + scalar / v.y, + scalar / v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x / v.x, + scalar.x / v.y, + scalar.x / v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x / v2.x, + v1.y / v2.y, + v1.z / v2.z); + } + + // -- Binary bit operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x % scalar, + v.y % scalar, + v.z % scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x % scalar.x, + v.y % scalar.x, + v.z % scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar % v.x, + scalar % v.y, + scalar % v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x % v.x, + scalar.x % v.y, + scalar.x % v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x % v2.x, + v1.y % v2.y, + v1.z % v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x & scalar, + v.y & scalar, + v.z & scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x & scalar.x, + v.y & scalar.x, + v.z & scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar & v.x, + scalar & v.y, + scalar & v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x & v.x, + scalar.x & v.y, + scalar.x & v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x & v2.x, + v1.y & v2.y, + v1.z & v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x | scalar, + v.y | scalar, + v.z | scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x | scalar.x, + v.y | scalar.x, + v.z | scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar | v.x, + scalar | v.y, + scalar | v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x | v.x, + scalar.x | v.y, + scalar.x | v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x | v2.x, + v1.y | v2.y, + v1.z | v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x ^ scalar, + v.y ^ scalar, + v.z ^ scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x ^ scalar.x, + v.y ^ scalar.x, + v.z ^ scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar ^ v.x, + scalar ^ v.y, + scalar ^ v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x ^ v.x, + scalar.x ^ v.y, + scalar.x ^ v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x ^ v2.x, + v1.y ^ v2.y, + v1.z ^ v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x << scalar, + v.y << scalar, + v.z << scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x << scalar.x, + v.y << scalar.x, + v.z << scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar << v.x, + scalar << v.y, + scalar << v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x << v.x, + scalar.x << v.y, + scalar.x << v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x << v2.x, + v1.y << v2.y, + v1.z << v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x >> scalar, + v.y >> scalar, + v.z >> scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x >> scalar.x, + v.y >> scalar.x, + v.z >> scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar >> v.x, + scalar >> v.y, + scalar >> v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x >> v.x, + scalar.x >> v.y, + scalar.x >> v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x >> v2.x, + v1.y >> v2.y, + v1.z >> v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator~(vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + ~v.x, + ~v.y, + ~v.z); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return + detail::compute_equal::is_iec559>::call(v1.x, v2.x) && + detail::compute_equal::is_iec559>::call(v1.y, v2.y) && + detail::compute_equal::is_iec559>::call(v1.z, v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return !(v1 == v2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, bool, Q> operator&&(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2) + { + return vec<3, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, bool, Q> operator||(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2) + { + return vec<3, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/detail/type_vec4.hpp b/NothinFancy/dep/include/glm/detail/type_vec4.hpp new file mode 100644 index 0000000..4a36434 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_vec4.hpp @@ -0,0 +1,505 @@ +/// @ref core +/// @file glm/detail/type_vec4.hpp + +#pragma once + +#include "qualifier.hpp" +#if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +# include "_swizzle.hpp" +#elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION +# include "_swizzle_func.hpp" +#endif +#include + +namespace glm +{ + template + struct vec<4, T, Q> + { + // -- Implementation detail -- + + typedef T value_type; + typedef vec<4, T, Q> type; + typedef vec<4, bool, Q> bool_type; + + // -- Data -- + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +# endif +# endif + +# if GLM_CONFIG_XYZW_ONLY + T x, y, z, w; +# elif GLM_CONFIG_ANONYMOUS_STRUCT == GLM_ENABLE + union + { + struct { T x, y, z, w; }; + struct { T r, g, b, a; }; + struct { T s, t, p, q; }; + + typename detail::storage<4, T, detail::is_aligned::value>::type data; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + GLM_SWIZZLE4_2_MEMBERS(T, Q, x, y, z, w) + GLM_SWIZZLE4_2_MEMBERS(T, Q, r, g, b, a) + GLM_SWIZZLE4_2_MEMBERS(T, Q, s, t, p, q) + GLM_SWIZZLE4_3_MEMBERS(T, Q, x, y, z, w) + GLM_SWIZZLE4_3_MEMBERS(T, Q, r, g, b, a) + GLM_SWIZZLE4_3_MEMBERS(T, Q, s, t, p, q) + GLM_SWIZZLE4_4_MEMBERS(T, Q, x, y, z, w) + GLM_SWIZZLE4_4_MEMBERS(T, Q, r, g, b, a) + GLM_SWIZZLE4_4_MEMBERS(T, Q, s, t, p, q) +# endif + }; +# else + union { T x, r, s; }; + union { T y, g, t; }; + union { T z, b, p; }; + union { T w, a, q; }; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION + GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, Q) +# endif +# endif + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif +# endif + + // -- Component accesses -- + + typedef length_t length_type; + + /// Return the count of components of the vector + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;} + + GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<4, T, Q> const& v) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<4, T, P> const& v); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR vec(T x, T y, T z, T w); + + // -- Conversion scalar constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(vec<1, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, Z _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, Z _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, Z _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, vec<1, Z, Q> const& _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, Z _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _Y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); + + // -- Conversion vector constructors -- + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, B _z, C _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, C _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, B _z, vec<1, C, P> const& _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<2, B, P> const& _yz, C _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, C _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, B _y, vec<2, C, P> const& _zw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, B _y, vec<2, C, P> const& _zw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<3, A, P> const& _xyz, B _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<3, B, P> const& _yzw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<4, U, P> const& v); + + // -- Swizzle constructors -- +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<4, T, Q, E0, E1, E2, E3> const& that) + { + *this = that(); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, detail::_swizzle<2, T, Q, F0, F1, -1, -2> const& u) + { + *this = vec<4, T, Q>(v(), u()); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, T const& y, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v) + { + *this = vec<4, T, Q>(x, y, v()); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& w) + { + *this = vec<4, T, Q>(x, v(), w); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& z, T const& w) + { + *this = vec<4, T, Q>(v(), z, w); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v, T const& w) + { + *this = vec<4, T, Q>(v(), w); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v) + { + *this = vec<4, T, Q>(x, v()); + } +# endif//GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator=(vec<4, T, Q> const& v) GLM_DEFAULT; + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(vec<4, U, Q> const& v); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator++(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator--(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator++(int); + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator--(int); + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(vec<4, U, Q> const& v); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v); + + // -- Binary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v, T const & scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v, T const & scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, T const & scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v, T const & scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator~(vec<4, T, Q> const& v); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec4.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/NothinFancy/dep/include/glm/detail/type_vec4.inl b/NothinFancy/dep/include/glm/detail/type_vec4.inl new file mode 100644 index 0000000..3c212d9 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_vec4.inl @@ -0,0 +1,1140 @@ +/// @ref core + +#include "compute_vector_relational.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_vec4_add + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); + } + }; + + template + struct compute_vec4_sub + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); + } + }; + + template + struct compute_vec4_mul + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); + } + }; + + template + struct compute_vec4_div + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); + } + }; + + template + struct compute_vec4_mod + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x % b.x, a.y % b.y, a.z % b.z, a.w % b.w); + } + }; + + template + struct compute_vec4_and + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x & b.x, a.y & b.y, a.z & b.z, a.w & b.w); + } + }; + + template + struct compute_vec4_or + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x | b.x, a.y | b.y, a.z | b.z, a.w | b.w); + } + }; + + template + struct compute_vec4_xor + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x ^ b.x, a.y ^ b.y, a.z ^ b.z, a.w ^ b.w); + } + }; + + template + struct compute_vec4_shift_left + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x << b.x, a.y << b.y, a.z << b.z, a.w << b.w); + } + }; + + template + struct compute_vec4_shift_right + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x >> b.x, a.y >> b.y, a.z >> b.z, a.w >> b.w); + } + }; + + template + struct compute_vec4_equal + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return + detail::compute_equal::is_iec559>::call(v1.x, v2.x) && + detail::compute_equal::is_iec559>::call(v1.y, v2.y) && + detail::compute_equal::is_iec559>::call(v1.z, v2.z) && + detail::compute_equal::is_iec559>::call(v1.w, v2.w); + } + }; + + template + struct compute_vec4_nequal + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return !compute_vec4_equal::value, sizeof(T) * 8, detail::is_aligned::value>::call(v1, v2); + } + }; + + template + struct compute_vec4_bitwise_not + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& v) + { + return vec<4, T, Q>(~v.x, ~v.y, ~v.z, ~v.w); + } + }; +}//namespace detail + + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec() +# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE + : x(0), y(0), z(0), w(0) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<4, T, Q> const& v) + : x(v.x), y(v.y), z(v.z), w(v.w) + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<4, T, P> const& v) + : x(v.x), y(v.y), z(v.z), w(v.w) + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(T scalar) + : x(scalar), y(scalar), z(scalar), w(scalar) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(T _x, T _y, T _z, T _w) + : x(_x), y(_y), z(_z), w(_w) + {} + + // -- Conversion scalar constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.x)) + , z(static_cast(v.x)) + , w(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, Y _y, Z _z, W _w) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, Z _z, W _w) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, Z _z, W _w) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, W _w) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, Y _y, vec<1, Z, Q> const& _z, W _w) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, W _w) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, Z _z, vec<1, W, Q> const& _w) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + , w(static_cast(_w.x)) + {} + + // -- Conversion vector constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, B _z, C _w) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, C _w) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z.x)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, B _z, vec<1, C, P> const& _w) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z.x)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<2, B, P> const& _yz, C _w) + : x(static_cast(_x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, C _w) + : x(static_cast(_x.x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w) + : x(static_cast(_x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w) + : x(static_cast(_x.x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, B _y, vec<2, C, P> const& _zw) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_zw.x)) + , w(static_cast(_zw.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, B _y, vec<2, C, P> const& _zw) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_zw.x)) + , w(static_cast(_zw.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_zw.x)) + , w(static_cast(_zw.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_zw.x)) + , w(static_cast(_zw.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<3, A, P> const& _xyz, B _w) + : x(static_cast(_xyz.x)) + , y(static_cast(_xyz.y)) + , z(static_cast(_xyz.z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w) + : x(static_cast(_xyz.x)) + , y(static_cast(_xyz.y)) + , z(static_cast(_xyz.z)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<3, B, P> const& _yzw) + : x(static_cast(_x)) + , y(static_cast(_yzw.x)) + , z(static_cast(_yzw.y)) + , w(static_cast(_yzw.z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw) + : x(static_cast(_x.x)) + , y(static_cast(_yzw.x)) + , z(static_cast(_yzw.y)) + , w(static_cast(_yzw.z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_zw.x)) + , w(static_cast(_zw.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<4, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + , z(static_cast(v.z)) + , w(static_cast(v.w)) + {} + + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i) + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + case 2: + return z; + case 3: + return w; + } + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i) const + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + case 2: + return z; + case 3: + return w; + } + } + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>& vec<4, T, Q>::operator=(vec<4, T, Q> const& v) + { + this->x = v.x; + this->y = v.y; + this->z = v.z; + this->w = v.w; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>& vec<4, T, Q>::operator=(vec<4, U, Q> const& v) + { + this->x = static_cast(v.x); + this->y = static_cast(v.y); + this->z = static_cast(v.z); + this->w = static_cast(v.w); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator+=(U scalar) + { + return (*this = detail::compute_vec4_add::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator+=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_add::value>::call(*this, vec<4, T, Q>(v.x))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator+=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_add::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator-=(U scalar) + { + return (*this = detail::compute_vec4_sub::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator-=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_sub::value>::call(*this, vec<4, T, Q>(v.x))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator-=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_sub::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator*=(U scalar) + { + return (*this = detail::compute_vec4_mul::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator*=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_mul::value>::call(*this, vec<4, T, Q>(v.x))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator*=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_mul::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator/=(U scalar) + { + return (*this = detail::compute_vec4_div::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator/=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_div::value>::call(*this, vec<4, T, Q>(v.x))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator/=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_div::value>::call(*this, vec<4, T, Q>(v))); + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator++() + { + ++this->x; + ++this->y; + ++this->z; + ++this->w; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator--() + { + --this->x; + --this->y; + --this->z; + --this->w; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> vec<4, T, Q>::operator++(int) + { + vec<4, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> vec<4, T, Q>::operator--(int) + { + vec<4, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary bit operators -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator%=(U scalar) + { + return (*this = detail::compute_vec4_mod::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator%=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_mod::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator%=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_mod::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator&=(U scalar) + { + return (*this = detail::compute_vec4_and::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator&=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_and::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator&=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_and::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator|=(U scalar) + { + return (*this = detail::compute_vec4_or::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator|=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_or::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator|=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_or::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator^=(U scalar) + { + return (*this = detail::compute_vec4_xor::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator^=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_xor::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator^=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_xor::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator<<=(U scalar) + { + return (*this = detail::compute_vec4_shift_left::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator<<=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_shift_left::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator<<=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_shift_left::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator>>=(U scalar) + { + return (*this = detail::compute_vec4_shift_right::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator>>=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_shift_right::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator>>=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_shift_right::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + // -- Unary constant operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v) + { + return v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v) + { + return vec<4, T, Q>(0) -= v; + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v, T const & scalar) + { + return vec<4, T, Q>(v) += scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) += v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(v) += scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v2) += v1; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) += v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v, T const & scalar) + { + return vec<4, T, Q>(v) -= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) -= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) -= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) -= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) -= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, T const & scalar) + { + return vec<4, T, Q>(v) *= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) *= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(v) *= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v2) *= v1; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) *= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v, T const & scalar) + { + return vec<4, T, Q>(v) /= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) /= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) /= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) /= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) /= v2; + } + + // -- Binary bit operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) %= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) %= v2.x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) %= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar.x) %= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) %= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) &= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<4, T, Q>(v) &= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) &= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) &= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) &= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) |= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) |= v2.x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) |= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) |= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) |= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) ^= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) ^= v2.x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) ^= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) ^= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) ^= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) <<= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) <<= v2.x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) <<= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) <<= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) <<= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) >>= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) >>= v2.x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) >>= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) >>= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) >>= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator~(vec<4, T, Q> const& v) + { + return detail::compute_vec4_bitwise_not::value, sizeof(T) * 8, detail::is_aligned::value>::call(v); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return detail::compute_vec4_equal::value, sizeof(T) * 8, detail::is_aligned::value>::call(v1, v2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return detail::compute_vec4_nequal::value, sizeof(T) * 8, detail::is_aligned::value>::call(v1, v2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2) + { + return vec<4, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z, v1.w && v2.w); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2) + { + return vec<4, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z, v1.w || v2.w); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "type_vec4_simd.inl" +#endif diff --git a/NothinFancy/dep/include/glm/detail/type_vec4_simd.inl b/NothinFancy/dep/include/glm/detail/type_vec4_simd.inl new file mode 100644 index 0000000..29559b5 --- /dev/null +++ b/NothinFancy/dep/include/glm/detail/type_vec4_simd.inl @@ -0,0 +1,775 @@ +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + template + struct _swizzle_base1<4, float, Q, E0,E1,E2,E3, true> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<4, float, Q> operator ()() const + { + __m128 data = *reinterpret_cast<__m128 const*>(&this->_buffer); + + vec<4, float, Q> Result; +# if GLM_ARCH & GLM_ARCH_AVX_BIT + Result.data = _mm_permute_ps(data, _MM_SHUFFLE(E3, E2, E1, E0)); +# else + Result.data = _mm_shuffle_ps(data, data, _MM_SHUFFLE(E3, E2, E1, E0)); +# endif + return Result; + } + }; + + template + struct _swizzle_base1<4, int, Q, E0,E1,E2,E3, true> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<4, int, Q> operator ()() const + { + __m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer); + + vec<4, int, Q> Result; + Result.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0)); + return Result; + } + }; + + template + struct _swizzle_base1<4, uint, Q, E0,E1,E2,E3, true> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<4, uint, Q> operator ()() const + { + __m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer); + + vec<4, uint, Q> Result; + Result.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0)); + return Result; + } + }; +# endif// GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + + template + struct compute_vec4_add + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = _mm_add_ps(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_vec4_add + { + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) + { + vec<4, double, Q> Result; + Result.data = _mm256_add_pd(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_sub + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = _mm_sub_ps(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_vec4_sub + { + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) + { + vec<4, double, Q> Result; + Result.data = _mm256_sub_pd(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_mul + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = _mm_mul_ps(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_vec4_mul + { + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) + { + vec<4, double, Q> Result; + Result.data = _mm256_mul_pd(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_div + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = _mm_div_ps(a.data, b.data); + return Result; + } + }; + + # if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_vec4_div + { + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) + { + vec<4, double, Q> Result; + Result.data = _mm256_div_pd(a.data, b.data); + return Result; + } + }; +# endif + + template<> + struct compute_vec4_div + { + static vec<4, float, aligned_lowp> call(vec<4, float, aligned_lowp> const& a, vec<4, float, aligned_lowp> const& b) + { + vec<4, float, aligned_lowp> Result; + Result.data = _mm_mul_ps(a.data, _mm_rcp_ps(b.data)); + return Result; + } + }; + + template + struct compute_vec4_and + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm_and_si128(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_and + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm256_and_si256(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_or + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm_or_si128(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_or + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm256_or_si256(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_xor + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm_xor_si128(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_xor + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm256_xor_si256(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_shift_left + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm_sll_epi32(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_shift_left + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm256_sll_epi64(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_shift_right + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm_srl_epi32(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_shift_right + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm256_srl_epi64(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_bitwise_not + { + static vec<4, T, Q> call(vec<4, T, Q> const& v) + { + vec<4, T, Q> Result; + Result.data = _mm_xor_si128(v.data, _mm_set1_epi32(-1)); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_bitwise_not + { + static vec<4, T, Q> call(vec<4, T, Q> const& v) + { + vec<4, T, Q> Result; + Result.data = _mm256_xor_si256(v.data, _mm_set1_epi32(-1)); + return Result; + } + }; +# endif + + template + struct compute_vec4_equal + { + static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + return _mm_movemask_ps(_mm_cmpeq_ps(v1.data, v2.data)) != 0; + } + }; + +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + template + struct compute_vec4_equal + { + static bool call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + //return _mm_movemask_epi8(_mm_cmpeq_epi32(v1.data, v2.data)) != 0; + __m128i neq = _mm_xor_si128(v1.data, v2.data); + return _mm_test_all_zeros(neq, neq) == 0; + } + }; +# endif + + template + struct compute_vec4_nequal + { + static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + return _mm_movemask_ps(_mm_cmpneq_ps(v1.data, v2.data)) != 0; + } + }; + +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + template + struct compute_vec4_nequal + { + static bool call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + //return _mm_movemask_epi8(_mm_cmpneq_epi32(v1.data, v2.data)) != 0; + __m128i neq = _mm_xor_si128(v1.data, v2.data); + return _mm_test_all_zeros(neq, neq) != 0; + } + }; +# endif +}//namespace detail + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(float _s) : + data(_mm_set1_ps(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(float _s) : + data(_mm_set1_ps(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(float _s) : + data(_mm_set1_ps(_s)) + {} + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, double, aligned_lowp>::vec(double _s) : + data(_mm256_set1_pd(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, double, aligned_mediump>::vec(double _s) : + data(_mm256_set1_pd(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, double, aligned_highp>::vec(double _s) : + data(_mm256_set1_pd(_s)) + {} +# endif + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_lowp>::vec(int _s) : + data(_mm_set1_epi32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_mediump>::vec(int _s) : + data(_mm_set1_epi32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_highp>::vec(int _s) : + data(_mm_set1_epi32(_s)) + {} + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, detail::int64, aligned_lowp>::vec(detail::int64 _s) : + data(_mm256_set1_epi64x(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, detail::int64, aligned_mediump>::vec(detail::int64 _s) : + data(_mm256_set1_epi64x(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, detail::int64, aligned_highp>::vec(detail::int64 _s) : + data(_mm256_set1_epi64x(_s)) + {} +# endif + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(float _x, float _y, float _z, float _w) : + data(_mm_set_ps(_w, _z, _y, _x)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(float _x, float _y, float _z, float _w) : + data(_mm_set_ps(_w, _z, _y, _x)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(float _x, float _y, float _z, float _w) : + data(_mm_set_ps(_w, _z, _y, _x)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_lowp>::vec(int _x, int _y, int _z, int _w) : + data(_mm_set_epi32(_w, _z, _y, _x)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_mediump>::vec(int _x, int _y, int _z, int _w) : + data(_mm_set_epi32(_w, _z, _y, _x)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_highp>::vec(int _x, int _y, int _z, int _w) : + data(_mm_set_epi32(_w, _z, _y, _x)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(int _x, int _y, int _z, int _w) : + data(_mm_cvtepi32_ps(_mm_set_epi32(_w, _z, _y, _x))) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(int _x, int _y, int _z, int _w) : + data(_mm_cvtepi32_ps(_mm_set_epi32(_w, _z, _y, _x))) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(int _x, int _y, int _z, int _w) : + data(_mm_cvtepi32_ps(_mm_set_epi32(_w, _z, _y, _x))) + {} +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT + +#if GLM_ARCH & GLM_ARCH_NEON_BIT +namespace glm { +namespace detail { + + template + struct compute_vec4_add + { + static + vec<4, float, Q> + call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = vaddq_f32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_add + { + static + vec<4, uint, Q> + call(vec<4, uint, Q> const& a, vec<4, uint, Q> const& b) + { + vec<4, uint, Q> Result; + Result.data = vaddq_u32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_add + { + static + vec<4, int, Q> + call(vec<4, int, Q> const& a, vec<4, int, Q> const& b) + { + vec<4, uint, Q> Result; + Result.data = vaddq_s32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_sub + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = vsubq_f32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_sub + { + static vec<4, uint, Q> call(vec<4, uint, Q> const& a, vec<4, uint, Q> const& b) + { + vec<4, uint, Q> Result; + Result.data = vsubq_u32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_sub + { + static vec<4, int, Q> call(vec<4, int, Q> const& a, vec<4, int, Q> const& b) + { + vec<4, int, Q> Result; + Result.data = vsubq_s32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_mul + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = vmulq_f32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_mul + { + static vec<4, uint, Q> call(vec<4, uint, Q> const& a, vec<4, uint, Q> const& b) + { + vec<4, uint, Q> Result; + Result.data = vmulq_u32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_mul + { + static vec<4, int, Q> call(vec<4, int, Q> const& a, vec<4, int, Q> const& b) + { + vec<4, int, Q> Result; + Result.data = vmulq_s32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_div + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = vdivq_f32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_equal + { + static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + uint32x4_t cmp = vceqq_f32(v1.data, v2.data); +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + cmp = vpminq_u32(cmp, cmp); + cmp = vpminq_u32(cmp, cmp); + uint32_t r = cmp[0]; +#else + uint32x2_t cmpx2 = vpmin_u32(vget_low_f32(cmp), vget_high_f32(cmp)); + cmpx2 = vpmin_u32(cmpx2, cmpx2); + uint32_t r = cmpx2[0]; +#endif + return r == ~0u; + } + }; + + template + struct compute_vec4_equal + { + static bool call(vec<4, uint, Q> const& v1, vec<4, uint, Q> const& v2) + { + uint32x4_t cmp = vceqq_u32(v1.data, v2.data); +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + cmp = vpminq_u32(cmp, cmp); + cmp = vpminq_u32(cmp, cmp); + uint32_t r = cmp[0]; +#else + uint32x2_t cmpx2 = vpmin_u32(vget_low_f32(cmp), vget_high_f32(cmp)); + cmpx2 = vpmin_u32(cmpx2, cmpx2); + uint32_t r = cmpx2[0]; +#endif + return r == ~0u; + } + }; + + template + struct compute_vec4_equal + { + static bool call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + uint32x4_t cmp = vceqq_s32(v1.data, v2.data); +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + cmp = vpminq_u32(cmp, cmp); + cmp = vpminq_u32(cmp, cmp); + uint32_t r = cmp[0]; +#else + uint32x2_t cmpx2 = vpmin_u32(vget_low_f32(cmp), vget_high_f32(cmp)); + cmpx2 = vpmin_u32(cmpx2, cmpx2); + uint32_t r = cmpx2[0]; +#endif + return r == ~0u; + } + }; + + template + struct compute_vec4_nequal + { + static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + return !compute_vec4_equal::call(v1, v2); + } + }; + + template + struct compute_vec4_nequal + { + static bool call(vec<4, uint, Q> const& v1, vec<4, uint, Q> const& v2) + { + return !compute_vec4_equal::call(v1, v2); + } + }; + + template + struct compute_vec4_nequal + { + static bool call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + return !compute_vec4_equal::call(v1, v2); + } + }; + +}//namespace detail + +#if !GLM_CONFIG_XYZW_ONLY + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(float _s) : + data(vdupq_n_f32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(float _s) : + data(vdupq_n_f32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(float _s) : + data(vdupq_n_f32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_lowp>::vec(int _s) : + data(vdupq_n_s32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_mediump>::vec(int _s) : + data(vdupq_n_s32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_highp>::vec(int _s) : + data(vdupq_n_s32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, uint, aligned_lowp>::vec(uint _s) : + data(vdupq_n_u32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, uint, aligned_mediump>::vec(uint _s) : + data(vdupq_n_u32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, uint, aligned_highp>::vec(uint _s) : + data(vdupq_n_u32(_s)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(const vec<4, float, aligned_highp>& rhs) : + data(rhs.data) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(const vec<4, int, aligned_highp>& rhs) : + data(vcvtq_f32_s32(rhs.data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(const vec<4, uint, aligned_highp>& rhs) : + data(vcvtq_f32_u32(rhs.data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(int _x, int _y, int _z, int _w) : + data(vcvtq_f32_s32(vec<4, int, aligned_lowp>(_x, _y, _z, _w).data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(int _x, int _y, int _z, int _w) : + data(vcvtq_f32_s32(vec<4, int, aligned_mediump>(_x, _y, _z, _w).data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(int _x, int _y, int _z, int _w) : + data(vcvtq_f32_s32(vec<4, int, aligned_highp>(_x, _y, _z, _w).data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(uint _x, uint _y, uint _z, uint _w) : + data(vcvtq_f32_u32(vec<4, uint, aligned_lowp>(_x, _y, _z, _w).data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(uint _x, uint _y, uint _z, uint _w) : + data(vcvtq_f32_u32(vec<4, uint, aligned_mediump>(_x, _y, _z, _w).data)) + {} + + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(uint _x, uint _y, uint _z, uint _w) : + data(vcvtq_f32_u32(vec<4, uint, aligned_highp>(_x, _y, _z, _w).data)) + {} + +#endif +}//namespace glm + +#endif diff --git a/NothinFancy/dep/include/glm/exponential.hpp b/NothinFancy/dep/include/glm/exponential.hpp new file mode 100644 index 0000000..f8fb886 --- /dev/null +++ b/NothinFancy/dep/include/glm/exponential.hpp @@ -0,0 +1,110 @@ +/// @ref core +/// @file glm/exponential.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions +/// +/// @defgroup core_func_exponential Exponential functions +/// @ingroup core +/// +/// Provides GLSL exponential functions +/// +/// These all operate component-wise. The description is per component. +/// +/// Include to use these core features. + +#pragma once + +#include "detail/type_vec1.hpp" +#include "detail/type_vec2.hpp" +#include "detail/type_vec3.hpp" +#include "detail/type_vec4.hpp" +#include + +namespace glm +{ + /// @addtogroup core_func_exponential + /// @{ + + /// Returns 'base' raised to the power 'exponent'. + /// + /// @param base Floating point value. pow function is defined for input values of 'base' defined in the range (inf-, inf+) in the limit of the type qualifier. + /// @param exponent Floating point value representing the 'exponent'. + /// + /// @see GLSL pow man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec pow(vec const& base, vec const& exponent); + + /// Returns the natural exponentiation of x, i.e., e^x. + /// + /// @param v exp function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL exp man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec exp(vec const& v); + + /// Returns the natural logarithm of v, i.e., + /// returns the value y which satisfies the equation x = e^y. + /// Results are undefined if v <= 0. + /// + /// @param v log function is defined for input values of v defined in the range (0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL log man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec log(vec const& v); + + /// Returns 2 raised to the v power. + /// + /// @param v exp2 function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL exp2 man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec exp2(vec const& v); + + /// Returns the base 2 log of x, i.e., returns the value y, + /// which satisfies the equation x = 2 ^ y. + /// + /// @param v log2 function is defined for input values of v defined in the range (0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL log2 man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec log2(vec const& v); + + /// Returns the positive square root of v. + /// + /// @param v sqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL sqrt man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec sqrt(vec const& v); + + /// Returns the reciprocal of the positive square root of v. + /// + /// @param v inversesqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL inversesqrt man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec inversesqrt(vec const& v); + + /// @} +}//namespace glm + +#include "detail/func_exponential.inl" diff --git a/NothinFancy/dep/include/glm/ext.hpp b/NothinFancy/dep/include/glm/ext.hpp new file mode 100644 index 0000000..3249fb9 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext.hpp @@ -0,0 +1,253 @@ +/// @file glm/ext.hpp +/// +/// @ref core (Dependence) + +#include "detail/setup.hpp" + +#pragma once + +#include "glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_MESSAGE_EXT_INCLUDED_DISPLAYED) +# define GLM_MESSAGE_EXT_INCLUDED_DISPLAYED +# pragma message("GLM: All extensions included (not recommended)") +#endif//GLM_MESSAGES + +#include "./ext/matrix_clip_space.hpp" +#include "./ext/matrix_common.hpp" + +#include "./ext/matrix_double2x2.hpp" +#include "./ext/matrix_double2x2_precision.hpp" +#include "./ext/matrix_double2x3.hpp" +#include "./ext/matrix_double2x3_precision.hpp" +#include "./ext/matrix_double2x4.hpp" +#include "./ext/matrix_double2x4_precision.hpp" +#include "./ext/matrix_double3x2.hpp" +#include "./ext/matrix_double3x2_precision.hpp" +#include "./ext/matrix_double3x3.hpp" +#include "./ext/matrix_double3x3_precision.hpp" +#include "./ext/matrix_double3x4.hpp" +#include "./ext/matrix_double3x4_precision.hpp" +#include "./ext/matrix_double4x2.hpp" +#include "./ext/matrix_double4x2_precision.hpp" +#include "./ext/matrix_double4x3.hpp" +#include "./ext/matrix_double4x3_precision.hpp" +#include "./ext/matrix_double4x4.hpp" +#include "./ext/matrix_double4x4_precision.hpp" + +#include "./ext/matrix_float2x2.hpp" +#include "./ext/matrix_float2x2_precision.hpp" +#include "./ext/matrix_float2x3.hpp" +#include "./ext/matrix_float2x3_precision.hpp" +#include "./ext/matrix_float2x4.hpp" +#include "./ext/matrix_float2x4_precision.hpp" +#include "./ext/matrix_float3x2.hpp" +#include "./ext/matrix_float3x2_precision.hpp" +#include "./ext/matrix_float3x3.hpp" +#include "./ext/matrix_float3x3_precision.hpp" +#include "./ext/matrix_float3x4.hpp" +#include "./ext/matrix_float3x4_precision.hpp" +#include "./ext/matrix_float4x2.hpp" +#include "./ext/matrix_float4x2_precision.hpp" +#include "./ext/matrix_float4x3.hpp" +#include "./ext/matrix_float4x3_precision.hpp" +#include "./ext/matrix_float4x4.hpp" +#include "./ext/matrix_float4x4_precision.hpp" + +#include "./ext/matrix_int2x2.hpp" +#include "./ext/matrix_int2x2_sized.hpp" +#include "./ext/matrix_int2x3.hpp" +#include "./ext/matrix_int2x3_sized.hpp" +#include "./ext/matrix_int2x4.hpp" +#include "./ext/matrix_int2x4_sized.hpp" +#include "./ext/matrix_int3x2.hpp" +#include "./ext/matrix_int3x2_sized.hpp" +#include "./ext/matrix_int3x3.hpp" +#include "./ext/matrix_int3x3_sized.hpp" +#include "./ext/matrix_int3x4.hpp" +#include "./ext/matrix_int3x4_sized.hpp" +#include "./ext/matrix_int4x2.hpp" +#include "./ext/matrix_int4x2_sized.hpp" +#include "./ext/matrix_int4x3.hpp" +#include "./ext/matrix_int4x3_sized.hpp" +#include "./ext/matrix_int4x4.hpp" +#include "./ext/matrix_int4x4_sized.hpp" + +#include "./ext/matrix_uint2x2.hpp" +#include "./ext/matrix_uint2x2_sized.hpp" +#include "./ext/matrix_uint2x3.hpp" +#include "./ext/matrix_uint2x3_sized.hpp" +#include "./ext/matrix_uint2x4.hpp" +#include "./ext/matrix_uint2x4_sized.hpp" +#include "./ext/matrix_uint3x2.hpp" +#include "./ext/matrix_uint3x2_sized.hpp" +#include "./ext/matrix_uint3x3.hpp" +#include "./ext/matrix_uint3x3_sized.hpp" +#include "./ext/matrix_uint3x4.hpp" +#include "./ext/matrix_uint3x4_sized.hpp" +#include "./ext/matrix_uint4x2.hpp" +#include "./ext/matrix_uint4x2_sized.hpp" +#include "./ext/matrix_uint4x3.hpp" +#include "./ext/matrix_uint4x3_sized.hpp" +#include "./ext/matrix_uint4x4.hpp" +#include "./ext/matrix_uint4x4_sized.hpp" + +#include "./ext/matrix_projection.hpp" +#include "./ext/matrix_relational.hpp" +#include "./ext/matrix_transform.hpp" + +#include "./ext/quaternion_common.hpp" +#include "./ext/quaternion_double.hpp" +#include "./ext/quaternion_double_precision.hpp" +#include "./ext/quaternion_float.hpp" +#include "./ext/quaternion_float_precision.hpp" +#include "./ext/quaternion_exponential.hpp" +#include "./ext/quaternion_geometric.hpp" +#include "./ext/quaternion_relational.hpp" +#include "./ext/quaternion_transform.hpp" +#include "./ext/quaternion_trigonometric.hpp" + +#include "./ext/scalar_common.hpp" +#include "./ext/scalar_constants.hpp" +#include "./ext/scalar_integer.hpp" +#include "./ext/scalar_packing.hpp" +#include "./ext/scalar_relational.hpp" +#include "./ext/scalar_ulp.hpp" + +#include "./ext/scalar_int_sized.hpp" +#include "./ext/scalar_uint_sized.hpp" + +#include "./ext/vector_common.hpp" +#include "./ext/vector_integer.hpp" +#include "./ext/vector_packing.hpp" +#include "./ext/vector_relational.hpp" +#include "./ext/vector_ulp.hpp" + +#include "./ext/vector_bool1.hpp" +#include "./ext/vector_bool1_precision.hpp" +#include "./ext/vector_bool2.hpp" +#include "./ext/vector_bool2_precision.hpp" +#include "./ext/vector_bool3.hpp" +#include "./ext/vector_bool3_precision.hpp" +#include "./ext/vector_bool4.hpp" +#include "./ext/vector_bool4_precision.hpp" + +#include "./ext/vector_double1.hpp" +#include "./ext/vector_double1_precision.hpp" +#include "./ext/vector_double2.hpp" +#include "./ext/vector_double2_precision.hpp" +#include "./ext/vector_double3.hpp" +#include "./ext/vector_double3_precision.hpp" +#include "./ext/vector_double4.hpp" +#include "./ext/vector_double4_precision.hpp" + +#include "./ext/vector_float1.hpp" +#include "./ext/vector_float1_precision.hpp" +#include "./ext/vector_float2.hpp" +#include "./ext/vector_float2_precision.hpp" +#include "./ext/vector_float3.hpp" +#include "./ext/vector_float3_precision.hpp" +#include "./ext/vector_float4.hpp" +#include "./ext/vector_float4_precision.hpp" + +#include "./ext/vector_int1.hpp" +#include "./ext/vector_int1_sized.hpp" +#include "./ext/vector_int2.hpp" +#include "./ext/vector_int2_sized.hpp" +#include "./ext/vector_int3.hpp" +#include "./ext/vector_int3_sized.hpp" +#include "./ext/vector_int4.hpp" +#include "./ext/vector_int4_sized.hpp" + +#include "./ext/vector_uint1.hpp" +#include "./ext/vector_uint1_sized.hpp" +#include "./ext/vector_uint2.hpp" +#include "./ext/vector_uint2_sized.hpp" +#include "./ext/vector_uint3.hpp" +#include "./ext/vector_uint3_sized.hpp" +#include "./ext/vector_uint4.hpp" +#include "./ext/vector_uint4_sized.hpp" + +#include "./gtc/bitfield.hpp" +#include "./gtc/color_space.hpp" +#include "./gtc/constants.hpp" +#include "./gtc/epsilon.hpp" +#include "./gtc/integer.hpp" +#include "./gtc/matrix_access.hpp" +#include "./gtc/matrix_integer.hpp" +#include "./gtc/matrix_inverse.hpp" +#include "./gtc/matrix_transform.hpp" +#include "./gtc/noise.hpp" +#include "./gtc/packing.hpp" +#include "./gtc/quaternion.hpp" +#include "./gtc/random.hpp" +#include "./gtc/reciprocal.hpp" +#include "./gtc/round.hpp" +#include "./gtc/type_precision.hpp" +#include "./gtc/type_ptr.hpp" +#include "./gtc/ulp.hpp" +#include "./gtc/vec1.hpp" +#if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE +# include "./gtc/type_aligned.hpp" +#endif + +#ifdef GLM_ENABLE_EXPERIMENTAL +#include "./gtx/associated_min_max.hpp" +#include "./gtx/bit.hpp" +#include "./gtx/closest_point.hpp" +#include "./gtx/color_encoding.hpp" +#include "./gtx/color_space.hpp" +#include "./gtx/color_space_YCoCg.hpp" +#include "./gtx/compatibility.hpp" +#include "./gtx/component_wise.hpp" +#include "./gtx/dual_quaternion.hpp" +#include "./gtx/euler_angles.hpp" +#include "./gtx/extend.hpp" +#include "./gtx/extended_min_max.hpp" +#include "./gtx/fast_exponential.hpp" +#include "./gtx/fast_square_root.hpp" +#include "./gtx/fast_trigonometry.hpp" +#include "./gtx/functions.hpp" +#include "./gtx/gradient_paint.hpp" +#include "./gtx/handed_coordinate_space.hpp" +#include "./gtx/integer.hpp" +#include "./gtx/intersect.hpp" +#include "./gtx/log_base.hpp" +#include "./gtx/matrix_cross_product.hpp" +#include "./gtx/matrix_interpolation.hpp" +#include "./gtx/matrix_major_storage.hpp" +#include "./gtx/matrix_operation.hpp" +#include "./gtx/matrix_query.hpp" +#include "./gtx/mixed_product.hpp" +#include "./gtx/norm.hpp" +#include "./gtx/normal.hpp" +#include "./gtx/normalize_dot.hpp" +#include "./gtx/number_precision.hpp" +#include "./gtx/optimum_pow.hpp" +#include "./gtx/orthonormalize.hpp" +#include "./gtx/perpendicular.hpp" +#include "./gtx/polar_coordinates.hpp" +#include "./gtx/projection.hpp" +#include "./gtx/quaternion.hpp" +#include "./gtx/raw_data.hpp" +#include "./gtx/rotate_vector.hpp" +#include "./gtx/spline.hpp" +#include "./gtx/std_based_type.hpp" +#if !(GLM_COMPILER & GLM_COMPILER_CUDA) +# include "./gtx/string_cast.hpp" +#endif +#include "./gtx/transform.hpp" +#include "./gtx/transform2.hpp" +#include "./gtx/vec_swizzle.hpp" +#include "./gtx/vector_angle.hpp" +#include "./gtx/vector_query.hpp" +#include "./gtx/wrap.hpp" + +#if GLM_HAS_TEMPLATE_ALIASES +# include "./gtx/scalar_multiplication.hpp" +#endif + +#if GLM_HAS_RANGE_FOR +# include "./gtx/range.hpp" +#endif +#endif//GLM_ENABLE_EXPERIMENTAL diff --git a/NothinFancy/dep/include/glm/ext/matrix_clip_space.hpp b/NothinFancy/dep/include/glm/ext/matrix_clip_space.hpp new file mode 100644 index 0000000..c3874f2 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_clip_space.hpp @@ -0,0 +1,522 @@ +/// @ref ext_matrix_clip_space +/// @file glm/ext/matrix_clip_space.hpp +/// +/// @defgroup ext_matrix_clip_space GLM_EXT_matrix_clip_space +/// @ingroup ext +/// +/// Defines functions that generate clip space transformation matrices. +/// +/// The matrices generated by this extension use standard OpenGL fixed-function +/// conventions. For example, the lookAt function generates a transform from world +/// space into the specific eye space that the projective matrix functions +/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility +/// specifications defines the particular layout of this eye space. +/// +/// Include to use the features of this extension. +/// +/// @see ext_matrix_transform +/// @see ext_matrix_projection + +#pragma once + +// Dependencies +#include "../ext/scalar_constants.hpp" +#include "../geometric.hpp" +#include "../trigonometric.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_clip_space extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_clip_space + /// @{ + + /// Creates a matrix for projecting two-dimensional coordinates onto the screen. + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top, T const& zNear, T const& zFar) + /// @see gluOrtho2D man page + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> ortho( + T left, T right, T bottom, T top); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH_ZO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH_NO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH_ZO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH_NO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoZO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoNO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using right-handed coordinates. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + /// @see glOrtho man page + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> ortho( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a left handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH_ZO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a left handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH_NO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a right handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH_ZO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a right handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH_NO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a frustum matrix using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumZO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a frustum matrix using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumNO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a left handed frustum matrix. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a right handed frustum matrix. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a frustum matrix with default handedness, using the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @tparam T A floating-point scalar type + /// @see glFrustum man page + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustum( + T left, T right, T bottom, T top, T near, T far); + + + /// Creates a matrix for a right handed, symetric perspective-view frustum. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH_ZO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a right handed, symetric perspective-view frustum. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH_NO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a left handed, symetric perspective-view frustum. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH_ZO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a left handed, symetric perspective-view frustum. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH_NO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a symetric perspective-view frustum using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveZO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a symetric perspective-view frustum using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveNO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a right handed, symetric perspective-view frustum. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a left handed, symetric perspective-view frustum. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a symetric perspective-view frustum based on the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @param fovy Specifies the field of view angle in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + /// @see gluPerspective man page + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspective( + T fovy, T aspect, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH_ZO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH_NO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH_ZO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH_NO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovZO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovNO( + T fov, T width, T height, T near, T far); + + /// Builds a right handed perspective projection matrix based on a field of view. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH( + T fov, T width, T height, T near, T far); + + /// Builds a left handed perspective projection matrix based on a field of view. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view and the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFov( + T fov, T width, T height, T near, T far); + + /// Creates a matrix for a left handed, symmetric perspective-view frustum with far plane at infinite. + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspectiveLH( + T fovy, T aspect, T near); + + /// Creates a matrix for a right handed, symmetric perspective-view frustum with far plane at infinite. + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspectiveRH( + T fovy, T aspect, T near); + + /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite with default handedness. + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspective( + T fovy, T aspect, T near); + + /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping. + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> tweakedInfinitePerspective( + T fovy, T aspect, T near); + + /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping. + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param ep Epsilon + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> tweakedInfinitePerspective( + T fovy, T aspect, T near, T ep); + + /// @} +}//namespace glm + +#include "matrix_clip_space.inl" diff --git a/NothinFancy/dep/include/glm/ext/matrix_clip_space.inl b/NothinFancy/dep/include/glm/ext/matrix_clip_space.inl new file mode 100644 index 0000000..7e4df33 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_clip_space.inl @@ -0,0 +1,555 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> ortho(T left, T right, T bottom, T top) + { + mat<4, 4, T, defaultp> Result(static_cast(1)); + Result[0][0] = static_cast(2) / (right - left); + Result[1][1] = static_cast(2) / (top - bottom); + Result[2][2] = - static_cast(1); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH_ZO(T left, T right, T bottom, T top, T zNear, T zFar) + { + mat<4, 4, T, defaultp> Result(1); + Result[0][0] = static_cast(2) / (right - left); + Result[1][1] = static_cast(2) / (top - bottom); + Result[2][2] = static_cast(1) / (zFar - zNear); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - zNear / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH_NO(T left, T right, T bottom, T top, T zNear, T zFar) + { + mat<4, 4, T, defaultp> Result(1); + Result[0][0] = static_cast(2) / (right - left); + Result[1][1] = static_cast(2) / (top - bottom); + Result[2][2] = static_cast(2) / (zFar - zNear); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - (zFar + zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH_ZO(T left, T right, T bottom, T top, T zNear, T zFar) + { + mat<4, 4, T, defaultp> Result(1); + Result[0][0] = static_cast(2) / (right - left); + Result[1][1] = static_cast(2) / (top - bottom); + Result[2][2] = - static_cast(1) / (zFar - zNear); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - zNear / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH_NO(T left, T right, T bottom, T top, T zNear, T zFar) + { + mat<4, 4, T, defaultp> Result(1); + Result[0][0] = static_cast(2) / (right - left); + Result[1][1] = static_cast(2) / (top - bottom); + Result[2][2] = - static_cast(2) / (zFar - zNear); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - (zFar + zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoZO(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return orthoLH_ZO(left, right, bottom, top, zNear, zFar); +# else + return orthoRH_ZO(left, right, bottom, top, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoNO(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return orthoLH_NO(left, right, bottom, top, zNear, zFar); +# else + return orthoRH_NO(left, right, bottom, top, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return orthoLH_ZO(left, right, bottom, top, zNear, zFar); +# else + return orthoLH_NO(left, right, bottom, top, zNear, zFar); +# endif + + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return orthoRH_ZO(left, right, bottom, top, zNear, zFar); +# else + return orthoRH_NO(left, right, bottom, top, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> ortho(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_ZO + return orthoLH_ZO(left, right, bottom, top, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_NO + return orthoLH_NO(left, right, bottom, top, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_ZO + return orthoRH_ZO(left, right, bottom, top, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_NO + return orthoRH_NO(left, right, bottom, top, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH_ZO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); + Result[0][0] = (static_cast(2) * nearVal) / (right - left); + Result[1][1] = (static_cast(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = farVal / (farVal - nearVal); + Result[2][3] = static_cast(1); + Result[3][2] = -(farVal * nearVal) / (farVal - nearVal); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH_NO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); + Result[0][0] = (static_cast(2) * nearVal) / (right - left); + Result[1][1] = (static_cast(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = (farVal + nearVal) / (farVal - nearVal); + Result[2][3] = static_cast(1); + Result[3][2] = - (static_cast(2) * farVal * nearVal) / (farVal - nearVal); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH_ZO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); + Result[0][0] = (static_cast(2) * nearVal) / (right - left); + Result[1][1] = (static_cast(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = farVal / (nearVal - farVal); + Result[2][3] = static_cast(-1); + Result[3][2] = -(farVal * nearVal) / (farVal - nearVal); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH_NO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); + Result[0][0] = (static_cast(2) * nearVal) / (right - left); + Result[1][1] = (static_cast(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = - (farVal + nearVal) / (farVal - nearVal); + Result[2][3] = static_cast(-1); + Result[3][2] = - (static_cast(2) * farVal * nearVal) / (farVal - nearVal); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumZO(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return frustumLH_ZO(left, right, bottom, top, nearVal, farVal); +# else + return frustumRH_ZO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumNO(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return frustumLH_NO(left, right, bottom, top, nearVal, farVal); +# else + return frustumRH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return frustumLH_ZO(left, right, bottom, top, nearVal, farVal); +# else + return frustumLH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return frustumRH_ZO(left, right, bottom, top, nearVal, farVal); +# else + return frustumRH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustum(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_ZO + return frustumLH_ZO(left, right, bottom, top, nearVal, farVal); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_NO + return frustumLH_NO(left, right, bottom, top, nearVal, farVal); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_ZO + return frustumRH_ZO(left, right, bottom, top, nearVal, farVal); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_NO + return frustumRH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH_ZO(T fovy, T aspect, T zNear, T zFar) + { + assert(abs(aspect - std::numeric_limits::epsilon()) > static_cast(0)); + + T const tanHalfFovy = tan(fovy / static_cast(2)); + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = static_cast(1) / (aspect * tanHalfFovy); + Result[1][1] = static_cast(1) / (tanHalfFovy); + Result[2][2] = zFar / (zNear - zFar); + Result[2][3] = - static_cast(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH_NO(T fovy, T aspect, T zNear, T zFar) + { + assert(abs(aspect - std::numeric_limits::epsilon()) > static_cast(0)); + + T const tanHalfFovy = tan(fovy / static_cast(2)); + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = static_cast(1) / (aspect * tanHalfFovy); + Result[1][1] = static_cast(1) / (tanHalfFovy); + Result[2][2] = - (zFar + zNear) / (zFar - zNear); + Result[2][3] = - static_cast(1); + Result[3][2] = - (static_cast(2) * zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH_ZO(T fovy, T aspect, T zNear, T zFar) + { + assert(abs(aspect - std::numeric_limits::epsilon()) > static_cast(0)); + + T const tanHalfFovy = tan(fovy / static_cast(2)); + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = static_cast(1) / (aspect * tanHalfFovy); + Result[1][1] = static_cast(1) / (tanHalfFovy); + Result[2][2] = zFar / (zFar - zNear); + Result[2][3] = static_cast(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH_NO(T fovy, T aspect, T zNear, T zFar) + { + assert(abs(aspect - std::numeric_limits::epsilon()) > static_cast(0)); + + T const tanHalfFovy = tan(fovy / static_cast(2)); + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = static_cast(1) / (aspect * tanHalfFovy); + Result[1][1] = static_cast(1) / (tanHalfFovy); + Result[2][2] = (zFar + zNear) / (zFar - zNear); + Result[2][3] = static_cast(1); + Result[3][2] = - (static_cast(2) * zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveZO(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return perspectiveLH_ZO(fovy, aspect, zNear, zFar); +# else + return perspectiveRH_ZO(fovy, aspect, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveNO(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return perspectiveLH_NO(fovy, aspect, zNear, zFar); +# else + return perspectiveRH_NO(fovy, aspect, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return perspectiveLH_ZO(fovy, aspect, zNear, zFar); +# else + return perspectiveLH_NO(fovy, aspect, zNear, zFar); +# endif + + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return perspectiveRH_ZO(fovy, aspect, zNear, zFar); +# else + return perspectiveRH_NO(fovy, aspect, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspective(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_ZO + return perspectiveLH_ZO(fovy, aspect, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_NO + return perspectiveLH_NO(fovy, aspect, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_ZO + return perspectiveRH_ZO(fovy, aspect, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_NO + return perspectiveRH_NO(fovy, aspect, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH_ZO(T fov, T width, T height, T zNear, T zFar) + { + assert(width > static_cast(0)); + assert(height > static_cast(0)); + assert(fov > static_cast(0)); + + T const rad = fov; + T const h = glm::cos(static_cast(0.5) * rad) / glm::sin(static_cast(0.5) * rad); + T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = zFar / (zNear - zFar); + Result[2][3] = - static_cast(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH_NO(T fov, T width, T height, T zNear, T zFar) + { + assert(width > static_cast(0)); + assert(height > static_cast(0)); + assert(fov > static_cast(0)); + + T const rad = fov; + T const h = glm::cos(static_cast(0.5) * rad) / glm::sin(static_cast(0.5) * rad); + T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = - (zFar + zNear) / (zFar - zNear); + Result[2][3] = - static_cast(1); + Result[3][2] = - (static_cast(2) * zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH_ZO(T fov, T width, T height, T zNear, T zFar) + { + assert(width > static_cast(0)); + assert(height > static_cast(0)); + assert(fov > static_cast(0)); + + T const rad = fov; + T const h = glm::cos(static_cast(0.5) * rad) / glm::sin(static_cast(0.5) * rad); + T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = zFar / (zFar - zNear); + Result[2][3] = static_cast(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH_NO(T fov, T width, T height, T zNear, T zFar) + { + assert(width > static_cast(0)); + assert(height > static_cast(0)); + assert(fov > static_cast(0)); + + T const rad = fov; + T const h = glm::cos(static_cast(0.5) * rad) / glm::sin(static_cast(0.5) * rad); + T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = (zFar + zNear) / (zFar - zNear); + Result[2][3] = static_cast(1); + Result[3][2] = - (static_cast(2) * zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovZO(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return perspectiveFovLH_ZO(fov, width, height, zNear, zFar); +# else + return perspectiveFovRH_ZO(fov, width, height, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovNO(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return perspectiveFovLH_NO(fov, width, height, zNear, zFar); +# else + return perspectiveFovRH_NO(fov, width, height, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return perspectiveFovLH_ZO(fov, width, height, zNear, zFar); +# else + return perspectiveFovLH_NO(fov, width, height, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return perspectiveFovRH_ZO(fov, width, height, zNear, zFar); +# else + return perspectiveFovRH_NO(fov, width, height, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFov(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_ZO + return perspectiveFovLH_ZO(fov, width, height, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_NO + return perspectiveFovLH_NO(fov, width, height, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_ZO + return perspectiveFovRH_ZO(fov, width, height, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_NO + return perspectiveFovRH_NO(fov, width, height, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspectiveRH(T fovy, T aspect, T zNear) + { + T const range = tan(fovy / static_cast(2)) * zNear; + T const left = -range * aspect; + T const right = range * aspect; + T const bottom = -range; + T const top = range; + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = (static_cast(2) * zNear) / (right - left); + Result[1][1] = (static_cast(2) * zNear) / (top - bottom); + Result[2][2] = - static_cast(1); + Result[2][3] = - static_cast(1); + Result[3][2] = - static_cast(2) * zNear; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspectiveLH(T fovy, T aspect, T zNear) + { + T const range = tan(fovy / static_cast(2)) * zNear; + T const left = -range * aspect; + T const right = range * aspect; + T const bottom = -range; + T const top = range; + + mat<4, 4, T, defaultp> Result(T(0)); + Result[0][0] = (static_cast(2) * zNear) / (right - left); + Result[1][1] = (static_cast(2) * zNear) / (top - bottom); + Result[2][2] = static_cast(1); + Result[2][3] = static_cast(1); + Result[3][2] = - static_cast(2) * zNear; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspective(T fovy, T aspect, T zNear) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return infinitePerspectiveLH(fovy, aspect, zNear); +# else + return infinitePerspectiveRH(fovy, aspect, zNear); +# endif + } + + // Infinite projection matrix: http://www.terathon.com/gdc07_lengyel.pdf + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear, T ep) + { + T const range = tan(fovy / static_cast(2)) * zNear; + T const left = -range * aspect; + T const right = range * aspect; + T const bottom = -range; + T const top = range; + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = (static_cast(2) * zNear) / (right - left); + Result[1][1] = (static_cast(2) * zNear) / (top - bottom); + Result[2][2] = ep - static_cast(1); + Result[2][3] = static_cast(-1); + Result[3][2] = (ep - static_cast(2)) * zNear; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear) + { + return tweakedInfinitePerspective(fovy, aspect, zNear, epsilon()); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_common.hpp b/NothinFancy/dep/include/glm/ext/matrix_common.hpp new file mode 100644 index 0000000..05c3799 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_common.hpp @@ -0,0 +1,36 @@ +/// @ref ext_matrix_common +/// @file glm/ext/matrix_common.hpp +/// +/// @defgroup ext_matrix_common GLM_EXT_matrix_common +/// @ingroup ext +/// +/// Defines functions for common matrix operations. +/// +/// Include to use the features of this extension. +/// +/// @see ext_matrix_common + +#pragma once + +#include "../detail/qualifier.hpp" +#include "../detail/_fixes.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_transform extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_common + /// @{ + + template + GLM_FUNC_DECL mat mix(mat const& x, mat const& y, mat const& a); + + template + GLM_FUNC_DECL mat mix(mat const& x, mat const& y, U a); + + /// @} +}//namespace glm + +#include "matrix_common.inl" diff --git a/NothinFancy/dep/include/glm/ext/matrix_common.inl b/NothinFancy/dep/include/glm/ext/matrix_common.inl new file mode 100644 index 0000000..9d50848 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_common.inl @@ -0,0 +1,16 @@ +#include "../matrix.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat mix(mat const& x, mat const& y, U a) + { + return mat(x) * (static_cast(1) - a) + mat(y) * a; + } + + template + GLM_FUNC_QUALIFIER mat mix(mat const& x, mat const& y, mat const& a) + { + return matrixCompMult(mat(x), static_cast(1) - a) + matrixCompMult(mat(y), a); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double2x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_double2x2.hpp new file mode 100644 index 0000000..94dca54 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double2x2.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_double2x2.hpp + +#pragma once +#include "../detail/type_mat2x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 2 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 2, double, defaultp> dmat2x2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 2, double, defaultp> dmat2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double2x2_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_double2x2_precision.hpp new file mode 100644 index 0000000..9e2c174 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double2x2_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_double2x2_precision.hpp + +#pragma once +#include "../detail/type_mat2x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, lowp> lowp_dmat2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, mediump> mediump_dmat2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, highp> highp_dmat2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, lowp> lowp_dmat2x2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, mediump> mediump_dmat2x2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, highp> highp_dmat2x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double2x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_double2x3.hpp new file mode 100644 index 0000000..bfef87a --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double2x3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double2x3.hpp + +#pragma once +#include "../detail/type_mat2x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 3 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 3, double, defaultp> dmat2x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double2x3_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_double2x3_precision.hpp new file mode 100644 index 0000000..098fb60 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double2x3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double2x3_precision.hpp + +#pragma once +#include "../detail/type_mat2x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 3 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, double, lowp> lowp_dmat2x3; + + /// 2 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, double, mediump> mediump_dmat2x3; + + /// 2 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, double, highp> highp_dmat2x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double2x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_double2x4.hpp new file mode 100644 index 0000000..499284b --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double2x4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double2x4.hpp + +#pragma once +#include "../detail/type_mat2x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 4 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 4, double, defaultp> dmat2x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double2x4_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_double2x4_precision.hpp new file mode 100644 index 0000000..9b61ebc --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double2x4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double2x4_precision.hpp + +#pragma once +#include "../detail/type_mat2x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 4 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, double, lowp> lowp_dmat2x4; + + /// 2 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, double, mediump> mediump_dmat2x4; + + /// 2 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, double, highp> highp_dmat2x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double3x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_double3x2.hpp new file mode 100644 index 0000000..dd23f36 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double3x2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double3x2.hpp + +#pragma once +#include "../detail/type_mat3x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 3 columns of 2 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 2, double, defaultp> dmat3x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double3x2_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_double3x2_precision.hpp new file mode 100644 index 0000000..068d9e9 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double3x2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double3x2_precision.hpp + +#pragma once +#include "../detail/type_mat3x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 2 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, double, lowp> lowp_dmat3x2; + + /// 3 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, double, mediump> mediump_dmat3x2; + + /// 3 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, double, highp> highp_dmat3x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double3x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_double3x3.hpp new file mode 100644 index 0000000..53572b7 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double3x3.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_double3x3.hpp + +#pragma once +#include "../detail/type_mat3x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 3 columns of 3 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 3, double, defaultp> dmat3x3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 3, double, defaultp> dmat3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double3x3_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_double3x3_precision.hpp new file mode 100644 index 0000000..8691e78 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double3x3_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_double3x3_precision.hpp + +#pragma once +#include "../detail/type_mat3x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, lowp> lowp_dmat3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, mediump> mediump_dmat3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, highp> highp_dmat3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, lowp> lowp_dmat3x3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, mediump> mediump_dmat3x3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, highp> highp_dmat3x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double3x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_double3x4.hpp new file mode 100644 index 0000000..c572d63 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double3x4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double3x4.hpp + +#pragma once +#include "../detail/type_mat3x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 3 columns of 4 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 4, double, defaultp> dmat3x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double3x4_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_double3x4_precision.hpp new file mode 100644 index 0000000..f040217 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double3x4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double3x4_precision.hpp + +#pragma once +#include "../detail/type_mat3x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 4 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, double, lowp> lowp_dmat3x4; + + /// 3 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, double, mediump> mediump_dmat3x4; + + /// 3 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, double, highp> highp_dmat3x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double4x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_double4x2.hpp new file mode 100644 index 0000000..9b229f4 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double4x2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double4x2.hpp + +#pragma once +#include "../detail/type_mat4x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 4 columns of 2 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 2, double, defaultp> dmat4x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double4x2_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_double4x2_precision.hpp new file mode 100644 index 0000000..6ad18ba --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double4x2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double4x2_precision.hpp + +#pragma once +#include "../detail/type_mat4x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 2 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, double, lowp> lowp_dmat4x2; + + /// 4 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, double, mediump> mediump_dmat4x2; + + /// 4 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, double, highp> highp_dmat4x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double4x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_double4x3.hpp new file mode 100644 index 0000000..dca4cf9 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double4x3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double4x3.hpp + +#pragma once +#include "../detail/type_mat4x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 4 columns of 3 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 3, double, defaultp> dmat4x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double4x3_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_double4x3_precision.hpp new file mode 100644 index 0000000..f7371de --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double4x3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double4x3_precision.hpp + +#pragma once +#include "../detail/type_mat4x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 3 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, double, lowp> lowp_dmat4x3; + + /// 4 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, double, mediump> mediump_dmat4x3; + + /// 4 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, double, highp> highp_dmat4x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double4x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_double4x4.hpp new file mode 100644 index 0000000..81e1bf6 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double4x4.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_double4x4.hpp + +#pragma once +#include "../detail/type_mat4x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 4 columns of 4 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 4, double, defaultp> dmat4x4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 4, double, defaultp> dmat4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_double4x4_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_double4x4_precision.hpp new file mode 100644 index 0000000..4c36a84 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_double4x4_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_double4x4_precision.hpp + +#pragma once +#include "../detail/type_mat4x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, lowp> lowp_dmat4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, mediump> mediump_dmat4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, highp> highp_dmat4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, lowp> lowp_dmat4x4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, mediump> mediump_dmat4x4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, highp> highp_dmat4x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float2x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_float2x2.hpp new file mode 100644 index 0000000..53df921 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float2x2.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_float2x2.hpp + +#pragma once +#include "../detail/type_mat2x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 2 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 2, float, defaultp> mat2x2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 2, float, defaultp> mat2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float2x2_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_float2x2_precision.hpp new file mode 100644 index 0000000..898b6db --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float2x2_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_float2x2_precision.hpp + +#pragma once +#include "../detail/type_mat2x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, lowp> lowp_mat2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, mediump> mediump_mat2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, highp> highp_mat2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, lowp> lowp_mat2x2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, mediump> mediump_mat2x2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, highp> highp_mat2x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float2x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_float2x3.hpp new file mode 100644 index 0000000..6f68822 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float2x3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float2x3.hpp + +#pragma once +#include "../detail/type_mat2x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 3 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 3, float, defaultp> mat2x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float2x3_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_float2x3_precision.hpp new file mode 100644 index 0000000..50c1032 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float2x3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float2x3_precision.hpp + +#pragma once +#include "../detail/type_mat2x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 3 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, float, lowp> lowp_mat2x3; + + /// 2 columns of 3 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, float, mediump> mediump_mat2x3; + + /// 2 columns of 3 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, float, highp> highp_mat2x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float2x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_float2x4.hpp new file mode 100644 index 0000000..30f30de --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float2x4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float2x4.hpp + +#pragma once +#include "../detail/type_mat2x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 4 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 4, float, defaultp> mat2x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float2x4_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_float2x4_precision.hpp new file mode 100644 index 0000000..079d638 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float2x4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float2x4_precision.hpp + +#pragma once +#include "../detail/type_mat2x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 4 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, float, lowp> lowp_mat2x4; + + /// 2 columns of 4 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, float, mediump> mediump_mat2x4; + + /// 2 columns of 4 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, float, highp> highp_mat2x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float3x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_float3x2.hpp new file mode 100644 index 0000000..d39dd2f --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float3x2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float3x2.hpp + +#pragma once +#include "../detail/type_mat3x2.hpp" + +namespace glm +{ + /// @addtogroup core + /// @{ + + /// 3 columns of 2 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 2, float, defaultp> mat3x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float3x2_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_float3x2_precision.hpp new file mode 100644 index 0000000..8572c2a --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float3x2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float3x2_precision.hpp + +#pragma once +#include "../detail/type_mat3x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 2 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, float, lowp> lowp_mat3x2; + + /// 3 columns of 2 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, float, mediump> mediump_mat3x2; + + /// 3 columns of 2 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, float, highp> highp_mat3x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float3x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_float3x3.hpp new file mode 100644 index 0000000..177d809 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float3x3.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_float3x3.hpp + +#pragma once +#include "../detail/type_mat3x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 3 columns of 3 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 3, float, defaultp> mat3x3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 3, float, defaultp> mat3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float3x3_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_float3x3_precision.hpp new file mode 100644 index 0000000..8a900c1 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float3x3_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_float3x3_precision.hpp + +#pragma once +#include "../detail/type_mat3x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, lowp> lowp_mat3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, mediump> mediump_mat3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, highp> highp_mat3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, lowp> lowp_mat3x3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, mediump> mediump_mat3x3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, highp> highp_mat3x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float3x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_float3x4.hpp new file mode 100644 index 0000000..64b8459 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float3x4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float3x4.hpp + +#pragma once +#include "../detail/type_mat3x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 3 columns of 4 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 4, float, defaultp> mat3x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float3x4_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_float3x4_precision.hpp new file mode 100644 index 0000000..bc36bf1 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float3x4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float3x4_precision.hpp + +#pragma once +#include "../detail/type_mat3x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 4 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, float, lowp> lowp_mat3x4; + + /// 3 columns of 4 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, float, mediump> mediump_mat3x4; + + /// 3 columns of 4 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, float, highp> highp_mat3x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float4x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_float4x2.hpp new file mode 100644 index 0000000..1ed5227 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float4x2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float4x2.hpp + +#pragma once +#include "../detail/type_mat4x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 4 columns of 2 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 2, float, defaultp> mat4x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float4x2_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_float4x2_precision.hpp new file mode 100644 index 0000000..88fd069 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float4x2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float2x2_precision.hpp + +#pragma once +#include "../detail/type_mat2x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 2 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, float, lowp> lowp_mat4x2; + + /// 4 columns of 2 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, float, mediump> mediump_mat4x2; + + /// 4 columns of 2 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, float, highp> highp_mat4x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float4x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_float4x3.hpp new file mode 100644 index 0000000..5dbe765 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float4x3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float4x3.hpp + +#pragma once +#include "../detail/type_mat4x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 4 columns of 3 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 3, float, defaultp> mat4x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float4x3_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_float4x3_precision.hpp new file mode 100644 index 0000000..846ed4f --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float4x3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float4x3_precision.hpp + +#pragma once +#include "../detail/type_mat4x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 3 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, float, lowp> lowp_mat4x3; + + /// 4 columns of 3 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, float, mediump> mediump_mat4x3; + + /// 4 columns of 3 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, float, highp> highp_mat4x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float4x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_float4x4.hpp new file mode 100644 index 0000000..5ba111d --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float4x4.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_float4x4.hpp + +#pragma once +#include "../detail/type_mat4x4.hpp" + +namespace glm +{ + /// @ingroup core_matrix + /// @{ + + /// 4 columns of 4 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 4, float, defaultp> mat4x4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 4, float, defaultp> mat4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_float4x4_precision.hpp b/NothinFancy/dep/include/glm/ext/matrix_float4x4_precision.hpp new file mode 100644 index 0000000..597149b --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_float4x4_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_float4x4_precision.hpp + +#pragma once +#include "../detail/type_mat4x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, lowp> lowp_mat4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, mediump> mediump_mat4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, highp> highp_mat4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, lowp> lowp_mat4x4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, mediump> mediump_mat4x4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, highp> highp_mat4x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int2x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_int2x2.hpp new file mode 100644 index 0000000..c6aa068 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int2x2.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_int2x2 +/// @file glm/ext/matrix_int2x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x2 GLM_EXT_matrix_int2x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x2 + /// @{ + + /// Signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2 + typedef mat<2, 2, int, defaultp> imat2x2; + + /// Signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2 + typedef mat<2, 2, int, defaultp> imat2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int2x2_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_int2x2_sized.hpp new file mode 100644 index 0000000..70c0c21 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int2x2_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_int2x2_sized +/// @file glm/ext/matrix_int2x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x2_sized GLM_EXT_matrix_int2x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x2.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x2_sized + /// @{ + + /// 8 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int8, defaultp> i8mat2x2; + + /// 16 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int16, defaultp> i16mat2x2; + + /// 32 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int32, defaultp> i32mat2x2; + + /// 64 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int64, defaultp> i64mat2x2; + + + /// 8 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int8, defaultp> i8mat2; + + /// 16 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int16, defaultp> i16mat2; + + /// 32 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int32, defaultp> i32mat2; + + /// 64 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int64, defaultp> i64mat2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int2x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_int2x3.hpp new file mode 100644 index 0000000..aee415c --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int2x3.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int2x3 +/// @file glm/ext/matrix_int2x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x3 GLM_EXT_matrix_int2x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x3 + /// @{ + + /// Signed integer 2x3 matrix. + /// + /// @see ext_matrix_int2x3 + typedef mat<2, 3, int, defaultp> imat2x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int2x3_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_int2x3_sized.hpp new file mode 100644 index 0000000..b5526fe --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int2x3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int2x3_sized +/// @file glm/ext/matrix_int2x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x3_sized GLM_EXT_matrix_int2x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x3.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x3_sized + /// @{ + + /// 8 bit signed integer 2x3 matrix. + /// + /// @see ext_matrix_int2x3_sized + typedef mat<2, 3, int8, defaultp> i8mat2x3; + + /// 16 bit signed integer 2x3 matrix. + /// + /// @see ext_matrix_int2x3_sized + typedef mat<2, 3, int16, defaultp> i16mat2x3; + + /// 32 bit signed integer 2x3 matrix. + /// + /// @see ext_matrix_int2x3_sized + typedef mat<2, 3, int32, defaultp> i32mat2x3; + + /// 64 bit signed integer 2x3 matrix. + /// + /// @see ext_matrix_int2x3_sized + typedef mat<2, 3, int64, defaultp> i64mat2x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int2x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_int2x4.hpp new file mode 100644 index 0000000..4f36331 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int2x4.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int2x4 +/// @file glm/ext/matrix_int2x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x4 GLM_EXT_matrix_int2x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x4 + /// @{ + + /// Signed integer 2x4 matrix. + /// + /// @see ext_matrix_int2x4 + typedef mat<2, 4, int, defaultp> imat2x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int2x4_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_int2x4_sized.hpp new file mode 100644 index 0000000..a66a5e7 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int2x4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int2x4_sized +/// @file glm/ext/matrix_int2x4_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x4_sized GLM_EXT_matrix_int2x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x4.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x4_sized + /// @{ + + /// 8 bit signed integer 2x4 matrix. + /// + /// @see ext_matrix_int2x4_sized + typedef mat<2, 4, int8, defaultp> i8mat2x4; + + /// 16 bit signed integer 2x4 matrix. + /// + /// @see ext_matrix_int2x4_sized + typedef mat<2, 4, int16, defaultp> i16mat2x4; + + /// 32 bit signed integer 2x4 matrix. + /// + /// @see ext_matrix_int2x4_sized + typedef mat<2, 4, int32, defaultp> i32mat2x4; + + /// 64 bit signed integer 2x4 matrix. + /// + /// @see ext_matrix_int2x4_sized + typedef mat<2, 4, int64, defaultp> i64mat2x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int3x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_int3x2.hpp new file mode 100644 index 0000000..3bd563b --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int3x2.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int3x2 +/// @file glm/ext/matrix_int3x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x2 GLM_EXT_matrix_int3x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x2 + /// @{ + + /// Signed integer 3x2 matrix. + /// + /// @see ext_matrix_int3x2 + typedef mat<3, 2, int, defaultp> imat3x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int3x2_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_int3x2_sized.hpp new file mode 100644 index 0000000..7e34c52 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int3x2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int3x2_sized +/// @file glm/ext/matrix_int3x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x2_sized GLM_EXT_matrix_int3x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x2.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x2_sized + /// @{ + + /// 8 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_int3x2_sized + typedef mat<3, 2, int8, defaultp> i8mat3x2; + + /// 16 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_int3x2_sized + typedef mat<3, 2, int16, defaultp> i16mat3x2; + + /// 32 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_int3x2_sized + typedef mat<3, 2, int32, defaultp> i32mat3x2; + + /// 64 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_int3x2_sized + typedef mat<3, 2, int64, defaultp> i64mat3x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int3x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_int3x3.hpp new file mode 100644 index 0000000..287488d --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int3x3.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_int3x3 +/// @file glm/ext/matrix_int3x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x3 GLM_EXT_matrix_int3x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x3 + /// @{ + + /// Signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3 + typedef mat<3, 3, int, defaultp> imat3x3; + + /// Signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3 + typedef mat<3, 3, int, defaultp> imat3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int3x3_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_int3x3_sized.hpp new file mode 100644 index 0000000..577e305 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int3x3_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_int3x3_sized +/// @file glm/ext/matrix_int3x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x3_sized GLM_EXT_matrix_int3x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x3_sized + /// @{ + + /// 8 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int8, defaultp> i8mat3x3; + + /// 16 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int16, defaultp> i16mat3x3; + + /// 32 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int32, defaultp> i32mat3x3; + + /// 64 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int64, defaultp> i64mat3x3; + + + /// 8 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int8, defaultp> i8mat3; + + /// 16 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int16, defaultp> i16mat3; + + /// 32 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int32, defaultp> i32mat3; + + /// 64 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int64, defaultp> i64mat3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int3x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_int3x4.hpp new file mode 100644 index 0000000..08e534d --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int3x4.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int3x4 +/// @file glm/ext/matrix_int3x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x4 GLM_EXT_matrix_int3x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x4 + /// @{ + + /// Signed integer 3x4 matrix. + /// + /// @see ext_matrix_int3x4 + typedef mat<3, 4, int, defaultp> imat3x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int3x4_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_int3x4_sized.hpp new file mode 100644 index 0000000..692c48c --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int3x4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int3x4_sized +/// @file glm/ext/matrix_int3x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x4_sized GLM_EXT_matrix_int3x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x4.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x4_sized + /// @{ + + /// 8 bit signed integer 3x4 matrix. + /// + /// @see ext_matrix_int3x4_sized + typedef mat<3, 4, int8, defaultp> i8mat3x4; + + /// 16 bit signed integer 3x4 matrix. + /// + /// @see ext_matrix_int3x4_sized + typedef mat<3, 4, int16, defaultp> i16mat3x4; + + /// 32 bit signed integer 3x4 matrix. + /// + /// @see ext_matrix_int3x4_sized + typedef mat<3, 4, int32, defaultp> i32mat3x4; + + /// 64 bit signed integer 3x4 matrix. + /// + /// @see ext_matrix_int3x4_sized + typedef mat<3, 4, int64, defaultp> i64mat3x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int4x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_int4x2.hpp new file mode 100644 index 0000000..f756ef2 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int4x2.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int4x2 +/// @file glm/ext/matrix_int4x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x2 GLM_EXT_matrix_int4x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x2 + /// @{ + + /// Signed integer 4x2 matrix. + /// + /// @see ext_matrix_int4x2 + typedef mat<4, 2, int, defaultp> imat4x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int4x2_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_int4x2_sized.hpp new file mode 100644 index 0000000..63a99d6 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int4x2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int4x2_sized +/// @file glm/ext/matrix_int4x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x2_sized GLM_EXT_matrix_int4x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x2.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x2_sized + /// @{ + + /// 8 bit signed integer 4x2 matrix. + /// + /// @see ext_matrix_int4x2_sized + typedef mat<4, 2, int8, defaultp> i8mat4x2; + + /// 16 bit signed integer 4x2 matrix. + /// + /// @see ext_matrix_int4x2_sized + typedef mat<4, 2, int16, defaultp> i16mat4x2; + + /// 32 bit signed integer 4x2 matrix. + /// + /// @see ext_matrix_int4x2_sized + typedef mat<4, 2, int32, defaultp> i32mat4x2; + + /// 64 bit signed integer 4x2 matrix. + /// + /// @see ext_matrix_int4x2_sized + typedef mat<4, 2, int64, defaultp> i64mat4x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int4x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_int4x3.hpp new file mode 100644 index 0000000..d5d97a7 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int4x3.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int4x3 +/// @file glm/ext/matrix_int4x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x3 GLM_EXT_matrix_int4x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x3 + /// @{ + + /// Signed integer 4x3 matrix. + /// + /// @see ext_matrix_int4x3 + typedef mat<4, 3, int, defaultp> imat4x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int4x3_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_int4x3_sized.hpp new file mode 100644 index 0000000..55078fa --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int4x3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int4x3_sized +/// @file glm/ext/matrix_int4x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x3_sized GLM_EXT_matrix_int4x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x3.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x3_sized + /// @{ + + /// 8 bit signed integer 4x3 matrix. + /// + /// @see ext_matrix_int4x3_sized + typedef mat<4, 3, int8, defaultp> i8mat4x3; + + /// 16 bit signed integer 4x3 matrix. + /// + /// @see ext_matrix_int4x3_sized + typedef mat<4, 3, int16, defaultp> i16mat4x3; + + /// 32 bit signed integer 4x3 matrix. + /// + /// @see ext_matrix_int4x3_sized + typedef mat<4, 3, int32, defaultp> i32mat4x3; + + /// 64 bit signed integer 4x3 matrix. + /// + /// @see ext_matrix_int4x3_sized + typedef mat<4, 3, int64, defaultp> i64mat4x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int4x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_int4x4.hpp new file mode 100644 index 0000000..e17cff1 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int4x4.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_int4x4 +/// @file glm/ext/matrix_int4x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x4 GLM_EXT_matrix_int4x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x4 + /// @{ + + /// Signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4 + typedef mat<4, 4, int, defaultp> imat4x4; + + /// Signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4 + typedef mat<4, 4, int, defaultp> imat4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_int4x4_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_int4x4_sized.hpp new file mode 100644 index 0000000..4a11203 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_int4x4_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_int4x4_sized +/// @file glm/ext/matrix_int4x4_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x4_sized GLM_EXT_matrix_int4x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x4.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x4_sized + /// @{ + + /// 8 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int8, defaultp> i8mat4x4; + + /// 16 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int16, defaultp> i16mat4x4; + + /// 32 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int32, defaultp> i32mat4x4; + + /// 64 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int64, defaultp> i64mat4x4; + + + /// 8 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int8, defaultp> i8mat4; + + /// 16 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int16, defaultp> i16mat4; + + /// 32 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int32, defaultp> i32mat4; + + /// 64 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int64, defaultp> i64mat4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_projection.hpp b/NothinFancy/dep/include/glm/ext/matrix_projection.hpp new file mode 100644 index 0000000..51fd01b --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_projection.hpp @@ -0,0 +1,149 @@ +/// @ref ext_matrix_projection +/// @file glm/ext/matrix_projection.hpp +/// +/// @defgroup ext_matrix_projection GLM_EXT_matrix_projection +/// @ingroup ext +/// +/// Functions that generate common projection transformation matrices. +/// +/// The matrices generated by this extension use standard OpenGL fixed-function +/// conventions. For example, the lookAt function generates a transform from world +/// space into the specific eye space that the projective matrix functions +/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility +/// specifications defines the particular layout of this eye space. +/// +/// Include to use the features of this extension. +/// +/// @see ext_matrix_transform +/// @see ext_matrix_clip_space + +#pragma once + +// Dependencies +#include "../gtc/constants.hpp" +#include "../geometric.hpp" +#include "../trigonometric.hpp" +#include "../matrix.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_projection extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_projection + /// @{ + + /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param obj Specify the object coordinates. + /// @param model Specifies the current modelview matrix + /// @param proj Specifies the current projection matrix + /// @param viewport Specifies the current viewport + /// @return Return the computed window coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluProject man page + template + GLM_FUNC_DECL vec<3, T, Q> projectZO( + vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param obj Specify the object coordinates. + /// @param model Specifies the current modelview matrix + /// @param proj Specifies the current projection matrix + /// @param viewport Specifies the current viewport + /// @return Return the computed window coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluProject man page + template + GLM_FUNC_DECL vec<3, T, Q> projectNO( + vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates using default near and far clip planes definition. + /// To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @param obj Specify the object coordinates. + /// @param model Specifies the current modelview matrix + /// @param proj Specifies the current projection matrix + /// @param viewport Specifies the current viewport + /// @return Return the computed window coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluProject man page + template + GLM_FUNC_DECL vec<3, T, Q> project( + vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param win Specify the window coordinates to be mapped. + /// @param model Specifies the modelview matrix + /// @param proj Specifies the projection matrix + /// @param viewport Specifies the viewport + /// @return Returns the computed object coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluUnProject man page + template + GLM_FUNC_DECL vec<3, T, Q> unProjectZO( + vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param win Specify the window coordinates to be mapped. + /// @param model Specifies the modelview matrix + /// @param proj Specifies the projection matrix + /// @param viewport Specifies the viewport + /// @return Returns the computed object coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluUnProject man page + template + GLM_FUNC_DECL vec<3, T, Q> unProjectNO( + vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates using default near and far clip planes definition. + /// To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @param win Specify the window coordinates to be mapped. + /// @param model Specifies the modelview matrix + /// @param proj Specifies the projection matrix + /// @param viewport Specifies the viewport + /// @return Returns the computed object coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluUnProject man page + template + GLM_FUNC_DECL vec<3, T, Q> unProject( + vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Define a picking region + /// + /// @param center Specify the center of a picking region in window coordinates. + /// @param delta Specify the width and height, respectively, of the picking region in window coordinates. + /// @param viewport Rendering viewport + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluPickMatrix man page + template + GLM_FUNC_DECL mat<4, 4, T, Q> pickMatrix( + vec<2, T, Q> const& center, vec<2, T, Q> const& delta, vec<4, U, Q> const& viewport); + + /// @} +}//namespace glm + +#include "matrix_projection.inl" diff --git a/NothinFancy/dep/include/glm/ext/matrix_projection.inl b/NothinFancy/dep/include/glm/ext/matrix_projection.inl new file mode 100644 index 0000000..2f2c196 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_projection.inl @@ -0,0 +1,106 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> projectZO(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { + vec<4, T, Q> tmp = vec<4, T, Q>(obj, static_cast(1)); + tmp = model * tmp; + tmp = proj * tmp; + + tmp /= tmp.w; + tmp.x = tmp.x * static_cast(0.5) + static_cast(0.5); + tmp.y = tmp.y * static_cast(0.5) + static_cast(0.5); + + tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]); + tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]); + + return vec<3, T, Q>(tmp); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> projectNO(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { + vec<4, T, Q> tmp = vec<4, T, Q>(obj, static_cast(1)); + tmp = model * tmp; + tmp = proj * tmp; + + tmp /= tmp.w; + tmp = tmp * static_cast(0.5) + static_cast(0.5); + tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]); + tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]); + + return vec<3, T, Q>(tmp); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> project(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return projectZO(obj, model, proj, viewport); +# else + return projectNO(obj, model, proj, viewport); +# endif + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> unProjectZO(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { + mat<4, 4, T, Q> Inverse = inverse(proj * model); + + vec<4, T, Q> tmp = vec<4, T, Q>(win, T(1)); + tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]); + tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]); + tmp.x = tmp.x * static_cast(2) - static_cast(1); + tmp.y = tmp.y * static_cast(2) - static_cast(1); + + vec<4, T, Q> obj = Inverse * tmp; + obj /= obj.w; + + return vec<3, T, Q>(obj); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> unProjectNO(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { + mat<4, 4, T, Q> Inverse = inverse(proj * model); + + vec<4, T, Q> tmp = vec<4, T, Q>(win, T(1)); + tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]); + tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]); + tmp = tmp * static_cast(2) - static_cast(1); + + vec<4, T, Q> obj = Inverse * tmp; + obj /= obj.w; + + return vec<3, T, Q>(obj); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> unProject(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return unProjectZO(win, model, proj, viewport); +# else + return unProjectNO(win, model, proj, viewport); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> pickMatrix(vec<2, T, Q> const& center, vec<2, T, Q> const& delta, vec<4, U, Q> const& viewport) + { + assert(delta.x > static_cast(0) && delta.y > static_cast(0)); + mat<4, 4, T, Q> Result(static_cast(1)); + + if(!(delta.x > static_cast(0) && delta.y > static_cast(0))) + return Result; // Error + + vec<3, T, Q> Temp( + (static_cast(viewport[2]) - static_cast(2) * (center.x - static_cast(viewport[0]))) / delta.x, + (static_cast(viewport[3]) - static_cast(2) * (center.y - static_cast(viewport[1]))) / delta.y, + static_cast(0)); + + // Translate and scale the picked region to the entire window + Result = translate(Result, Temp); + return scale(Result, vec<3, T, Q>(static_cast(viewport[2]) / delta.x, static_cast(viewport[3]) / delta.y, static_cast(1))); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_relational.hpp b/NothinFancy/dep/include/glm/ext/matrix_relational.hpp new file mode 100644 index 0000000..20023ad --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_relational.hpp @@ -0,0 +1,132 @@ +/// @ref ext_matrix_relational +/// @file glm/ext/matrix_relational.hpp +/// +/// @defgroup ext_matrix_relational GLM_EXT_matrix_relational +/// @ingroup ext +/// +/// Exposes comparison functions for matrix types that take a user defined epsilon values. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_relational +/// @see ext_scalar_relational +/// @see ext_quaternion_relational + +#pragma once + +// Dependencies +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_relational extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_relational + /// @{ + + /// Perform a component-wise equal-to comparison of two matrices. + /// Return a boolean vector which components value is True if this expression is satisfied per column of the matrices. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(mat const& x, mat const& y); + + /// Perform a component-wise not-equal-to comparison of two matrices. + /// Return a boolean vector which components value is True if this expression is satisfied per column of the matrices. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(mat const& x, mat const& y, T epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(mat const& x, mat const& y, vec const& epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, T epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, vec const& epsilon); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(mat const& x, mat const& y, int ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(mat const& x, mat const& y, vec const& ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is not satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, int ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is not satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, vec const& ULPs); + + /// @} +}//namespace glm + +#include "matrix_relational.inl" diff --git a/NothinFancy/dep/include/glm/ext/matrix_relational.inl b/NothinFancy/dep/include/glm/ext/matrix_relational.inl new file mode 100644 index 0000000..b2b8753 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_relational.inl @@ -0,0 +1,82 @@ +/// @ref ext_vector_relational +/// @file glm/ext/vector_relational.inl + +// Dependency: +#include "../ext/vector_relational.hpp" +#include "../common.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(mat const& a, mat const& b) + { + return equal(a, b, static_cast(0)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(mat const& a, mat const& b, T Epsilon) + { + return equal(a, b, vec(Epsilon)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(mat const& a, mat const& b, vec const& Epsilon) + { + vec Result(true); + for(length_t i = 0; i < C; ++i) + Result[i] = all(equal(a[i], b[i], Epsilon[i])); + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y) + { + return notEqual(x, y, static_cast(0)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, T Epsilon) + { + return notEqual(x, y, vec(Epsilon)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(mat const& a, mat const& b, vec const& Epsilon) + { + vec Result(true); + for(length_t i = 0; i < C; ++i) + Result[i] = any(notEqual(a[i], b[i], Epsilon[i])); + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(mat const& a, mat const& b, int MaxULPs) + { + return equal(a, b, vec(MaxULPs)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(mat const& a, mat const& b, vec const& MaxULPs) + { + vec Result(true); + for(length_t i = 0; i < C; ++i) + Result[i] = all(equal(a[i], b[i], MaxULPs[i])); + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, int MaxULPs) + { + return notEqual(x, y, vec(MaxULPs)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(mat const& a, mat const& b, vec const& MaxULPs) + { + vec Result(true); + for(length_t i = 0; i < C; ++i) + Result[i] = any(notEqual(a[i], b[i], MaxULPs[i])); + return Result; + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_transform.hpp b/NothinFancy/dep/include/glm/ext/matrix_transform.hpp new file mode 100644 index 0000000..cbd187e --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_transform.hpp @@ -0,0 +1,144 @@ +/// @ref ext_matrix_transform +/// @file glm/ext/matrix_transform.hpp +/// +/// @defgroup ext_matrix_transform GLM_EXT_matrix_transform +/// @ingroup ext +/// +/// Defines functions that generate common transformation matrices. +/// +/// The matrices generated by this extension use standard OpenGL fixed-function +/// conventions. For example, the lookAt function generates a transform from world +/// space into the specific eye space that the projective matrix functions +/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility +/// specifications defines the particular layout of this eye space. +/// +/// Include to use the features of this extension. +/// +/// @see ext_matrix_projection +/// @see ext_matrix_clip_space + +#pragma once + +// Dependencies +#include "../gtc/constants.hpp" +#include "../geometric.hpp" +#include "../trigonometric.hpp" +#include "../matrix.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_transform extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_transform + /// @{ + + /// Builds an identity matrix. + template + GLM_FUNC_DECL GLM_CONSTEXPR genType identity(); + + /// Builds a translation 4 * 4 matrix created from a vector of 3 components. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param v Coordinates of a translation vector. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @code + /// #include + /// #include + /// ... + /// glm::mat4 m = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f)); + /// // m[0][0] == 1.0f, m[0][1] == 0.0f, m[0][2] == 0.0f, m[0][3] == 0.0f + /// // m[1][0] == 0.0f, m[1][1] == 1.0f, m[1][2] == 0.0f, m[1][3] == 0.0f + /// // m[2][0] == 0.0f, m[2][1] == 0.0f, m[2][2] == 1.0f, m[2][3] == 0.0f + /// // m[3][0] == 1.0f, m[3][1] == 1.0f, m[3][2] == 1.0f, m[3][3] == 1.0f + /// @endcode + /// + /// @see - translate(mat<4, 4, T, Q> const& m, T x, T y, T z) + /// @see - translate(vec<3, T, Q> const& v) + /// @see glTranslate man page + template + GLM_FUNC_DECL mat<4, 4, T, Q> translate( + mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v); + + /// Builds a rotation 4 * 4 matrix created from an axis vector and an angle. + /// + /// @param m Input matrix multiplied by this rotation matrix. + /// @param angle Rotation angle expressed in radians. + /// @param axis Rotation axis, recommended to be normalized. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - rotate(mat<4, 4, T, Q> const& m, T angle, T x, T y, T z) + /// @see - rotate(T angle, vec<3, T, Q> const& v) + /// @see glRotate man page + template + GLM_FUNC_DECL mat<4, 4, T, Q> rotate( + mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& axis); + + /// Builds a scale 4 * 4 matrix created from 3 scalars. + /// + /// @param m Input matrix multiplied by this scale matrix. + /// @param v Ratio of scaling for each axis. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - scale(mat<4, 4, T, Q> const& m, T x, T y, T z) + /// @see - scale(vec<3, T, Q> const& v) + /// @see glScale man page + template + GLM_FUNC_DECL mat<4, 4, T, Q> scale( + mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v); + + /// Build a right handed look at view matrix. + /// + /// @param eye Position of the camera + /// @param center Position where the camera is looking at + /// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1) + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) + template + GLM_FUNC_DECL mat<4, 4, T, Q> lookAtRH( + vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up); + + /// Build a left handed look at view matrix. + /// + /// @param eye Position of the camera + /// @param center Position where the camera is looking at + /// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1) + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) + template + GLM_FUNC_DECL mat<4, 4, T, Q> lookAtLH( + vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up); + + /// Build a look at view matrix based on the default handedness. + /// + /// @param eye Position of the camera + /// @param center Position where the camera is looking at + /// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1) + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) + /// @see gluLookAt man page + template + GLM_FUNC_DECL mat<4, 4, T, Q> lookAt( + vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up); + + /// @} +}//namespace glm + +#include "matrix_transform.inl" diff --git a/NothinFancy/dep/include/glm/ext/matrix_transform.inl b/NothinFancy/dep/include/glm/ext/matrix_transform.inl new file mode 100644 index 0000000..a415157 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_transform.inl @@ -0,0 +1,152 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType identity() + { + return detail::init_gentype::GENTYPE>::identity(); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v) + { + mat<4, 4, T, Q> Result(m); + Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate(mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& v) + { + T const a = angle; + T const c = cos(a); + T const s = sin(a); + + vec<3, T, Q> axis(normalize(v)); + vec<3, T, Q> temp((T(1) - c) * axis); + + mat<4, 4, T, Q> Rotate; + Rotate[0][0] = c + temp[0] * axis[0]; + Rotate[0][1] = temp[0] * axis[1] + s * axis[2]; + Rotate[0][2] = temp[0] * axis[2] - s * axis[1]; + + Rotate[1][0] = temp[1] * axis[0] - s * axis[2]; + Rotate[1][1] = c + temp[1] * axis[1]; + Rotate[1][2] = temp[1] * axis[2] + s * axis[0]; + + Rotate[2][0] = temp[2] * axis[0] + s * axis[1]; + Rotate[2][1] = temp[2] * axis[1] - s * axis[0]; + Rotate[2][2] = c + temp[2] * axis[2]; + + mat<4, 4, T, Q> Result; + Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; + Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; + Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; + Result[3] = m[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate_slow(mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& v) + { + T const a = angle; + T const c = cos(a); + T const s = sin(a); + mat<4, 4, T, Q> Result; + + vec<3, T, Q> axis = normalize(v); + + Result[0][0] = c + (static_cast(1) - c) * axis.x * axis.x; + Result[0][1] = (static_cast(1) - c) * axis.x * axis.y + s * axis.z; + Result[0][2] = (static_cast(1) - c) * axis.x * axis.z - s * axis.y; + Result[0][3] = static_cast(0); + + Result[1][0] = (static_cast(1) - c) * axis.y * axis.x - s * axis.z; + Result[1][1] = c + (static_cast(1) - c) * axis.y * axis.y; + Result[1][2] = (static_cast(1) - c) * axis.y * axis.z + s * axis.x; + Result[1][3] = static_cast(0); + + Result[2][0] = (static_cast(1) - c) * axis.z * axis.x + s * axis.y; + Result[2][1] = (static_cast(1) - c) * axis.z * axis.y - s * axis.x; + Result[2][2] = c + (static_cast(1) - c) * axis.z * axis.z; + Result[2][3] = static_cast(0); + + Result[3] = vec<4, T, Q>(0, 0, 0, 1); + return m * Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v) + { + mat<4, 4, T, Q> Result; + Result[0] = m[0] * v[0]; + Result[1] = m[1] * v[1]; + Result[2] = m[2] * v[2]; + Result[3] = m[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale_slow(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v) + { + mat<4, 4, T, Q> Result(T(1)); + Result[0][0] = v.x; + Result[1][1] = v.y; + Result[2][2] = v.z; + return m * Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtRH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up) + { + vec<3, T, Q> const f(normalize(center - eye)); + vec<3, T, Q> const s(normalize(cross(f, up))); + vec<3, T, Q> const u(cross(s, f)); + + mat<4, 4, T, Q> Result(1); + Result[0][0] = s.x; + Result[1][0] = s.y; + Result[2][0] = s.z; + Result[0][1] = u.x; + Result[1][1] = u.y; + Result[2][1] = u.z; + Result[0][2] =-f.x; + Result[1][2] =-f.y; + Result[2][2] =-f.z; + Result[3][0] =-dot(s, eye); + Result[3][1] =-dot(u, eye); + Result[3][2] = dot(f, eye); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtLH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up) + { + vec<3, T, Q> const f(normalize(center - eye)); + vec<3, T, Q> const s(normalize(cross(up, f))); + vec<3, T, Q> const u(cross(f, s)); + + mat<4, 4, T, Q> Result(1); + Result[0][0] = s.x; + Result[1][0] = s.y; + Result[2][0] = s.z; + Result[0][1] = u.x; + Result[1][1] = u.y; + Result[2][1] = u.z; + Result[0][2] = f.x; + Result[1][2] = f.y; + Result[2][2] = f.z; + Result[3][0] = -dot(s, eye); + Result[3][1] = -dot(u, eye); + Result[3][2] = -dot(f, eye); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAt(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up) + { + GLM_IF_CONSTEXPR(GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT) + return lookAtLH(eye, center, up); + else + return lookAtRH(eye, center, up); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint2x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint2x2.hpp new file mode 100644 index 0000000..034771a --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint2x2.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_uint2x2 +/// @file glm/ext/matrix_uint2x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint2x2 GLM_EXT_matrix_uint2x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x2 + /// @{ + + /// Unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2 + typedef mat<2, 2, uint, defaultp> umat2x2; + + /// Unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2 + typedef mat<2, 2, uint, defaultp> umat2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint2x2_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint2x2_sized.hpp new file mode 100644 index 0000000..4555324 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint2x2_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_uint2x2_sized +/// @file glm/ext/matrix_uint2x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint2x2_sized GLM_EXT_matrix_uint2x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x2.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x2_sized + /// @{ + + /// 8 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint8, defaultp> u8mat2x2; + + /// 16 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint16, defaultp> u16mat2x2; + + /// 32 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint32, defaultp> u32mat2x2; + + /// 64 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint64, defaultp> u64mat2x2; + + + /// 8 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint8, defaultp> u8mat2; + + /// 16 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint16, defaultp> u16mat2; + + /// 32 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint32, defaultp> u32mat2; + + /// 64 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint64, defaultp> u64mat2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint2x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint2x3.hpp new file mode 100644 index 0000000..7de62f6 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint2x3.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint2x3 +/// @file glm/ext/matrix_uint2x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x3 GLM_EXT_matrix_uint2x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x3 + /// @{ + + /// Unsigned integer 2x3 matrix. + /// + /// @see ext_matrix_uint2x3 + typedef mat<2, 3, uint, defaultp> umat2x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint2x3_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint2x3_sized.hpp new file mode 100644 index 0000000..db7939c --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint2x3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint2x3_sized +/// @file glm/ext/matrix_uint2x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint2x3_sized GLM_EXT_matrix_uint2x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x3.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x3_sized + /// @{ + + /// 8 bit unsigned integer 2x3 matrix. + /// + /// @see ext_matrix_uint2x3_sized + typedef mat<2, 3, uint8, defaultp> u8mat2x3; + + /// 16 bit unsigned integer 2x3 matrix. + /// + /// @see ext_matrix_uint2x3_sized + typedef mat<2, 3, uint16, defaultp> u16mat2x3; + + /// 32 bit unsigned integer 2x3 matrix. + /// + /// @see ext_matrix_uint2x3_sized + typedef mat<2, 3, uint32, defaultp> u32mat2x3; + + /// 64 bit unsigned integer 2x3 matrix. + /// + /// @see ext_matrix_uint2x3_sized + typedef mat<2, 3, uint64, defaultp> u64mat2x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint2x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint2x4.hpp new file mode 100644 index 0000000..0f99350 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint2x4.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint2x4 +/// @file glm/ext/matrix_uint2x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint2x4 GLM_EXT_matrix_int2x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x4 + /// @{ + + /// Unsigned integer 2x4 matrix. + /// + /// @see ext_matrix_uint2x4 + typedef mat<2, 4, uint, defaultp> umat2x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint2x4_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint2x4_sized.hpp new file mode 100644 index 0000000..5cb8e54 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint2x4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint2x4_sized +/// @file glm/ext/matrixu_uint2x4_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint2x4_sized GLM_EXT_matrix_uint2x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x4.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x4_sized + /// @{ + + /// 8 bit unsigned integer 2x4 matrix. + /// + /// @see ext_matrix_uint2x4_sized + typedef mat<2, 4, uint8, defaultp> u8mat2x4; + + /// 16 bit unsigned integer 2x4 matrix. + /// + /// @see ext_matrix_uint2x4_sized + typedef mat<2, 4, uint16, defaultp> u16mat2x4; + + /// 32 bit unsigned integer 2x4 matrix. + /// + /// @see ext_matrix_uint2x4_sized + typedef mat<2, 4, uint32, defaultp> u32mat2x4; + + /// 64 bit unsigned integer 2x4 matrix. + /// + /// @see ext_matrix_uint2x4_sized + typedef mat<2, 4, uint64, defaultp> u64mat2x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint3x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint3x2.hpp new file mode 100644 index 0000000..47f4873 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint3x2.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint3x2 +/// @file glm/ext/matrix_uint3x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x2 GLM_EXT_matrix_uint3x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x2 + /// @{ + + /// Unsigned integer 3x2 matrix. + /// + /// @see ext_matrix_uint3x2 + typedef mat<3, 2, uint, defaultp> umat3x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint3x2_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint3x2_sized.hpp new file mode 100644 index 0000000..c81af8f --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint3x2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint3x2_sized +/// @file glm/ext/matrix_uint3x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint3x2_sized GLM_EXT_matrix_uint3x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x2.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x2_sized + /// @{ + + /// 8 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_uint3x2_sized + typedef mat<3, 2, uint8, defaultp> u8mat3x2; + + /// 16 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_uint3x2_sized + typedef mat<3, 2, uint16, defaultp> u16mat3x2; + + /// 32 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_uint3x2_sized + typedef mat<3, 2, uint32, defaultp> u32mat3x2; + + /// 64 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_uint3x2_sized + typedef mat<3, 2, uint64, defaultp> u64mat3x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint3x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint3x3.hpp new file mode 100644 index 0000000..1004c0d --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint3x3.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_uint3x3 +/// @file glm/ext/matrix_uint3x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint3x3 GLM_EXT_matrix_uint3x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x3 + /// @{ + + /// Unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3 + typedef mat<3, 3, uint, defaultp> umat3x3; + + /// Unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3 + typedef mat<3, 3, uint, defaultp> umat3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint3x3_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint3x3_sized.hpp new file mode 100644 index 0000000..41a8be7 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint3x3_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_uint3x3_sized +/// @file glm/ext/matrix_uint3x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint3x3_sized GLM_EXT_matrix_uint3x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x3_sized + /// @{ + + /// 8 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint8, defaultp> u8mat3x3; + + /// 16 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint16, defaultp> u16mat3x3; + + /// 32 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint32, defaultp> u32mat3x3; + + /// 64 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint64, defaultp> u64mat3x3; + + + /// 8 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint8, defaultp> u8mat3; + + /// 16 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint16, defaultp> u16mat3; + + /// 32 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint32, defaultp> u32mat3; + + /// 64 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint64, defaultp> u64mat3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint3x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint3x4.hpp new file mode 100644 index 0000000..c6dd78c --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint3x4.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint3x4 +/// @file glm/ext/matrix_uint3x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint3x4 GLM_EXT_matrix_uint3x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x4 + /// @{ + + /// Signed integer 3x4 matrix. + /// + /// @see ext_matrix_uint3x4 + typedef mat<3, 4, uint, defaultp> umat3x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint3x4_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint3x4_sized.hpp new file mode 100644 index 0000000..2ce28ad --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint3x4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint3x4_sized +/// @file glm/ext/matrix_uint3x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint3x4_sized GLM_EXT_matrix_uint3x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x4.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x4_sized + /// @{ + + /// 8 bit unsigned integer 3x4 matrix. + /// + /// @see ext_matrix_uint3x4_sized + typedef mat<3, 4, uint8, defaultp> u8mat3x4; + + /// 16 bit unsigned integer 3x4 matrix. + /// + /// @see ext_matrix_uint3x4_sized + typedef mat<3, 4, uint16, defaultp> u16mat3x4; + + /// 32 bit unsigned integer 3x4 matrix. + /// + /// @see ext_matrix_uint3x4_sized + typedef mat<3, 4, uint32, defaultp> u32mat3x4; + + /// 64 bit unsigned integer 3x4 matrix. + /// + /// @see ext_matrix_uint3x4_sized + typedef mat<3, 4, uint64, defaultp> u64mat3x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint4x2.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint4x2.hpp new file mode 100644 index 0000000..0446f57 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint4x2.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint4x2 +/// @file glm/ext/matrix_uint4x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x2 GLM_EXT_matrix_uint4x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x2 + /// @{ + + /// Unsigned integer 4x2 matrix. + /// + /// @see ext_matrix_uint4x2 + typedef mat<4, 2, uint, defaultp> umat4x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint4x2_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint4x2_sized.hpp new file mode 100644 index 0000000..57a66bf --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint4x2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint4x2_sized +/// @file glm/ext/matrix_uint4x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x2_sized GLM_EXT_matrix_uint4x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x2.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x2_sized + /// @{ + + /// 8 bit unsigned integer 4x2 matrix. + /// + /// @see ext_matrix_uint4x2_sized + typedef mat<4, 2, uint8, defaultp> u8mat4x2; + + /// 16 bit unsigned integer 4x2 matrix. + /// + /// @see ext_matrix_uint4x2_sized + typedef mat<4, 2, uint16, defaultp> u16mat4x2; + + /// 32 bit unsigned integer 4x2 matrix. + /// + /// @see ext_matrix_uint4x2_sized + typedef mat<4, 2, uint32, defaultp> u32mat4x2; + + /// 64 bit unsigned integer 4x2 matrix. + /// + /// @see ext_matrix_uint4x2_sized + typedef mat<4, 2, uint64, defaultp> u64mat4x2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint4x3.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint4x3.hpp new file mode 100644 index 0000000..54c24e4 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint4x3.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint4x3 +/// @file glm/ext/matrix_uint4x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x3 GLM_EXT_matrix_uint4x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x3 + /// @{ + + /// Unsigned integer 4x3 matrix. + /// + /// @see ext_matrix_uint4x3 + typedef mat<4, 3, uint, defaultp> umat4x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint4x3_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint4x3_sized.hpp new file mode 100644 index 0000000..2e61124 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint4x3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint4x3_sized +/// @file glm/ext/matrix_uint4x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x3_sized GLM_EXT_matrix_uint4x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x3.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x3_sized + /// @{ + + /// 8 bit unsigned integer 4x3 matrix. + /// + /// @see ext_matrix_uint4x3_sized + typedef mat<4, 3, uint8, defaultp> u8mat4x3; + + /// 16 bit unsigned integer 4x3 matrix. + /// + /// @see ext_matrix_uint4x3_sized + typedef mat<4, 3, uint16, defaultp> u16mat4x3; + + /// 32 bit unsigned integer 4x3 matrix. + /// + /// @see ext_matrix_uint4x3_sized + typedef mat<4, 3, uint32, defaultp> u32mat4x3; + + /// 64 bit unsigned integer 4x3 matrix. + /// + /// @see ext_matrix_uint4x3_sized + typedef mat<4, 3, uint64, defaultp> u64mat4x3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint4x4.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint4x4.hpp new file mode 100644 index 0000000..5cc8455 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint4x4.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_uint4x4 +/// @file glm/ext/matrix_uint4x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x4 GLM_EXT_matrix_uint4x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x4 + /// @{ + + /// Unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4 + typedef mat<4, 4, uint, defaultp> umat4x4; + + /// Unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4 + typedef mat<4, 4, uint, defaultp> umat4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/matrix_uint4x4_sized.hpp b/NothinFancy/dep/include/glm/ext/matrix_uint4x4_sized.hpp new file mode 100644 index 0000000..bb10bd2 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/matrix_uint4x4_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_uint4x4_sized +/// @file glm/ext/matrix_uint4x4_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x4_sized GLM_EXT_matrix_uint4x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x4.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x4_sized + /// @{ + + /// 8 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint8, defaultp> u8mat4x4; + + /// 16 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint16, defaultp> u16mat4x4; + + /// 32 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint32, defaultp> u32mat4x4; + + /// 64 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint64, defaultp> u64mat4x4; + + + /// 8 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint8, defaultp> u8mat4; + + /// 16 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint16, defaultp> u16mat4; + + /// 32 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint32, defaultp> u32mat4; + + /// 64 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint64, defaultp> u64mat4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/quaternion_common.hpp b/NothinFancy/dep/include/glm/ext/quaternion_common.hpp new file mode 100644 index 0000000..f519d55 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_common.hpp @@ -0,0 +1,135 @@ +/// @ref ext_quaternion_common +/// @file glm/ext/quaternion_common.hpp +/// +/// @defgroup ext_quaternion_common GLM_EXT_quaternion_common +/// @ingroup ext +/// +/// Provides common functions for quaternion types +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_common +/// @see ext_vector_common +/// @see ext_quaternion_float +/// @see ext_quaternion_double +/// @see ext_quaternion_exponential +/// @see ext_quaternion_geometric +/// @see ext_quaternion_relational +/// @see ext_quaternion_trigonometric +/// @see ext_quaternion_transform + +#pragma once + +// Dependency: +#include "../ext/scalar_constants.hpp" +#include "../ext/quaternion_geometric.hpp" +#include "../common.hpp" +#include "../trigonometric.hpp" +#include "../exponential.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_common extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_common + /// @{ + + /// Spherical linear interpolation of two quaternions. + /// The interpolation is oriented and the rotation is performed at constant speed. + /// For short path spherical linear interpolation, use the slerp function. + /// + /// @param x A quaternion + /// @param y A quaternion + /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1]. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - slerp(qua const& x, qua const& y, T const& a) + template + GLM_FUNC_DECL qua mix(qua const& x, qua const& y, T a); + + /// Linear interpolation of two quaternions. + /// The interpolation is oriented. + /// + /// @param x A quaternion + /// @param y A quaternion + /// @param a Interpolation factor. The interpolation is defined in the range [0, 1]. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua lerp(qua const& x, qua const& y, T a); + + /// Spherical linear interpolation of two quaternions. + /// The interpolation always take the short path and the rotation is performed at constant speed. + /// + /// @param x A quaternion + /// @param y A quaternion + /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1]. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua slerp(qua const& x, qua const& y, T a); + + /// Spherical linear interpolation of two quaternions with multiple spins over rotation axis. + /// The interpolation always take the short path when the spin count is positive and long path + /// when count is negative. Rotation is performed at constant speed. + /// + /// @param x A quaternion + /// @param y A quaternion + /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1]. + /// @param k Additional spin count. If Value is negative interpolation will be on "long" path. + /// + /// @tparam T A floating-point scalar type + /// @tparam S An integer scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua slerp(qua const& x, qua const& y, T a, S k); + + /// Returns the q conjugate. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua conjugate(qua const& q); + + /// Returns the q inverse. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua inverse(qua const& q); + + /// Returns true if x holds a NaN (not a number) + /// representation in the underlying implementation's set of + /// floating point representations. Returns false otherwise, + /// including for implementations with no NaN + /// representations. + /// + /// /!\ When using compiler fast math, this function may fail. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> isnan(qua const& x); + + /// Returns true if x holds a positive infinity or negative + /// infinity representation in the underlying implementation's + /// set of floating point representations. Returns false + /// otherwise, including for implementations with no infinity + /// representations. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> isinf(qua const& x); + + /// @} +} //namespace glm + +#include "quaternion_common.inl" diff --git a/NothinFancy/dep/include/glm/ext/quaternion_common.inl b/NothinFancy/dep/include/glm/ext/quaternion_common.inl new file mode 100644 index 0000000..0e4a3bb --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_common.inl @@ -0,0 +1,144 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER qua mix(qua const& x, qua const& y, T a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'mix' only accept floating-point inputs"); + + T const cosTheta = dot(x, y); + + // Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator + if(cosTheta > static_cast(1) - epsilon()) + { + // Linear interpolation + return qua( + mix(x.w, y.w, a), + mix(x.x, y.x, a), + mix(x.y, y.y, a), + mix(x.z, y.z, a)); + } + else + { + // Essential Mathematics, page 467 + T angle = acos(cosTheta); + return (sin((static_cast(1) - a) * angle) * x + sin(a * angle) * y) / sin(angle); + } + } + + template + GLM_FUNC_QUALIFIER qua lerp(qua const& x, qua const& y, T a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'lerp' only accept floating-point inputs"); + + // Lerp is only defined in [0, 1] + assert(a >= static_cast(0)); + assert(a <= static_cast(1)); + + return x * (static_cast(1) - a) + (y * a); + } + + template + GLM_FUNC_QUALIFIER qua slerp(qua const& x, qua const& y, T a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'slerp' only accept floating-point inputs"); + + qua z = y; + + T cosTheta = dot(x, y); + + // If cosTheta < 0, the interpolation will take the long way around the sphere. + // To fix this, one quat must be negated. + if(cosTheta < static_cast(0)) + { + z = -y; + cosTheta = -cosTheta; + } + + // Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator + if(cosTheta > static_cast(1) - epsilon()) + { + // Linear interpolation + return qua( + mix(x.w, z.w, a), + mix(x.x, z.x, a), + mix(x.y, z.y, a), + mix(x.z, z.z, a)); + } + else + { + // Essential Mathematics, page 467 + T angle = acos(cosTheta); + return (sin((static_cast(1) - a) * angle) * x + sin(a * angle) * z) / sin(angle); + } + } + + template + GLM_FUNC_QUALIFIER qua slerp(qua const& x, qua const& y, T a, S k) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'slerp' only accept floating-point inputs"); + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'slerp' only accept integer for spin count"); + + qua z = y; + + T cosTheta = dot(x, y); + + // If cosTheta < 0, the interpolation will take the long way around the sphere. + // To fix this, one quat must be negated. + if (cosTheta < static_cast(0)) + { + z = -y; + cosTheta = -cosTheta; + } + + // Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator + if (cosTheta > static_cast(1) - epsilon()) + { + // Linear interpolation + return qua( + mix(x.w, z.w, a), + mix(x.x, z.x, a), + mix(x.y, z.y, a), + mix(x.z, z.z, a)); + } + else + { + // Graphics Gems III, page 96 + T angle = acos(cosTheta); + T phi = angle + k * glm::pi(); + return (sin(angle - a * phi)* x + sin(a * phi) * z) / sin(angle); + } + } + + template + GLM_FUNC_QUALIFIER qua conjugate(qua const& q) + { + return qua(q.w, -q.x, -q.y, -q.z); + } + + template + GLM_FUNC_QUALIFIER qua inverse(qua const& q) + { + return conjugate(q) / dot(q, q); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> isnan(qua const& q) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isnan' only accept floating-point inputs"); + + return vec<4, bool, Q>(isnan(q.x), isnan(q.y), isnan(q.z), isnan(q.w)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> isinf(qua const& q) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isinf' only accept floating-point inputs"); + + return vec<4, bool, Q>(isinf(q.x), isinf(q.y), isinf(q.z), isinf(q.w)); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "quaternion_common_simd.inl" +#endif + diff --git a/NothinFancy/dep/include/glm/ext/quaternion_common_simd.inl b/NothinFancy/dep/include/glm/ext/quaternion_common_simd.inl new file mode 100644 index 0000000..ddfc8a4 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_common_simd.inl @@ -0,0 +1,18 @@ +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ + template + struct compute_dot, float, true> + { + static GLM_FUNC_QUALIFIER float call(qua const& x, qua const& y) + { + return _mm_cvtss_f32(glm_vec1_dot(x.data, y.data)); + } + }; +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT + diff --git a/NothinFancy/dep/include/glm/ext/quaternion_double.hpp b/NothinFancy/dep/include/glm/ext/quaternion_double.hpp new file mode 100644 index 0000000..63b24de --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_double.hpp @@ -0,0 +1,39 @@ +/// @ref ext_quaternion_double +/// @file glm/ext/quaternion_double.hpp +/// +/// @defgroup ext_quaternion_double GLM_EXT_quaternion_double +/// @ingroup ext +/// +/// Exposes double-precision floating point quaternion type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_quaternion_float +/// @see ext_quaternion_double_precision +/// @see ext_quaternion_common +/// @see ext_quaternion_exponential +/// @see ext_quaternion_geometric +/// @see ext_quaternion_relational +/// @see ext_quaternion_transform +/// @see ext_quaternion_trigonometric + +#pragma once + +// Dependency: +#include "../detail/type_quat.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_double extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_double + /// @{ + + /// Quaternion of double-precision floating-point numbers. + typedef qua dquat; + + /// @} +} //namespace glm + diff --git a/NothinFancy/dep/include/glm/ext/quaternion_double_precision.hpp b/NothinFancy/dep/include/glm/ext/quaternion_double_precision.hpp new file mode 100644 index 0000000..8aa24a1 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_double_precision.hpp @@ -0,0 +1,42 @@ +/// @ref ext_quaternion_double_precision +/// @file glm/ext/quaternion_double_precision.hpp +/// +/// @defgroup ext_quaternion_double_precision GLM_EXT_quaternion_double_precision +/// @ingroup ext +/// +/// Exposes double-precision floating point quaternion type with various precision in term of ULPs. +/// +/// Include to use the features of this extension. + +#pragma once + +// Dependency: +#include "../detail/type_quat.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_double_precision extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_double_precision + /// @{ + + /// Quaternion of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see ext_quaternion_double_precision + typedef qua lowp_dquat; + + /// Quaternion of medium double-qualifier floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see ext_quaternion_double_precision + typedef qua mediump_dquat; + + /// Quaternion of high double-qualifier floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see ext_quaternion_double_precision + typedef qua highp_dquat; + + /// @} +} //namespace glm + diff --git a/NothinFancy/dep/include/glm/ext/quaternion_exponential.hpp b/NothinFancy/dep/include/glm/ext/quaternion_exponential.hpp new file mode 100644 index 0000000..affe297 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_exponential.hpp @@ -0,0 +1,63 @@ +/// @ref ext_quaternion_exponential +/// @file glm/ext/quaternion_exponential.hpp +/// +/// @defgroup ext_quaternion_exponential GLM_EXT_quaternion_exponential +/// @ingroup ext +/// +/// Provides exponential functions for quaternion types +/// +/// Include to use the features of this extension. +/// +/// @see core_exponential +/// @see ext_quaternion_float +/// @see ext_quaternion_double + +#pragma once + +// Dependency: +#include "../common.hpp" +#include "../trigonometric.hpp" +#include "../geometric.hpp" +#include "../ext/scalar_constants.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_exponential extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_transform + /// @{ + + /// Returns a exponential of a quaternion. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua exp(qua const& q); + + /// Returns a logarithm of a quaternion + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua log(qua const& q); + + /// Returns a quaternion raised to a power. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua pow(qua const& q, T y); + + /// Returns the square root of a quaternion + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua sqrt(qua const& q); + + /// @} +} //namespace glm + +#include "quaternion_exponential.inl" diff --git a/NothinFancy/dep/include/glm/ext/quaternion_exponential.inl b/NothinFancy/dep/include/glm/ext/quaternion_exponential.inl new file mode 100644 index 0000000..8456c00 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_exponential.inl @@ -0,0 +1,85 @@ +#include "scalar_constants.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER qua exp(qua const& q) + { + vec<3, T, Q> u(q.x, q.y, q.z); + T const Angle = glm::length(u); + if (Angle < epsilon()) + return qua(); + + vec<3, T, Q> const v(u / Angle); + return qua(cos(Angle), sin(Angle) * v); + } + + template + GLM_FUNC_QUALIFIER qua log(qua const& q) + { + vec<3, T, Q> u(q.x, q.y, q.z); + T Vec3Len = length(u); + + if (Vec3Len < epsilon()) + { + if(q.w > static_cast(0)) + return qua(log(q.w), static_cast(0), static_cast(0), static_cast(0)); + else if(q.w < static_cast(0)) + return qua(log(-q.w), pi(), static_cast(0), static_cast(0)); + else + return qua(std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity()); + } + else + { + T t = atan(Vec3Len, T(q.w)) / Vec3Len; + T QuatLen2 = Vec3Len * Vec3Len + q.w * q.w; + return qua(static_cast(0.5) * log(QuatLen2), t * q.x, t * q.y, t * q.z); + } + } + + template + GLM_FUNC_QUALIFIER qua pow(qua const& x, T y) + { + //Raising to the power of 0 should yield 1 + //Needed to prevent a division by 0 error later on + if(y > -epsilon() && y < epsilon()) + return qua(1,0,0,0); + + //To deal with non-unit quaternions + T magnitude = sqrt(x.x * x.x + x.y * x.y + x.z * x.z + x.w *x.w); + + T Angle; + if(abs(x.w / magnitude) > cos_one_over_two()) + { + //Scalar component is close to 1; using it to recover angle would lose precision + //Instead, we use the non-scalar components since sin() is accurate around 0 + + //Prevent a division by 0 error later on + T VectorMagnitude = x.x * x.x + x.y * x.y + x.z * x.z; + if (glm::abs(VectorMagnitude - static_cast(0)) < glm::epsilon()) { + //Equivalent to raising a real number to a power + return qua(pow(x.w, y), 0, 0, 0); + } + + Angle = asin(sqrt(VectorMagnitude) / magnitude); + } + else + { + //Scalar component is small, shouldn't cause loss of precision + Angle = acos(x.w / magnitude); + } + + T NewAngle = Angle * y; + T Div = sin(NewAngle) / sin(Angle); + T Mag = pow(magnitude, y - static_cast(1)); + return qua(cos(NewAngle) * magnitude * Mag, x.x * Div * Mag, x.y * Div * Mag, x.z * Div * Mag); + } + + template + GLM_FUNC_QUALIFIER qua sqrt(qua const& x) + { + return pow(x, static_cast(0.5)); + } +}//namespace glm + + diff --git a/NothinFancy/dep/include/glm/ext/quaternion_float.hpp b/NothinFancy/dep/include/glm/ext/quaternion_float.hpp new file mode 100644 index 0000000..ca42a60 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_float.hpp @@ -0,0 +1,39 @@ +/// @ref ext_quaternion_float +/// @file glm/ext/quaternion_float.hpp +/// +/// @defgroup ext_quaternion_float GLM_EXT_quaternion_float +/// @ingroup ext +/// +/// Exposes single-precision floating point quaternion type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_quaternion_double +/// @see ext_quaternion_float_precision +/// @see ext_quaternion_common +/// @see ext_quaternion_exponential +/// @see ext_quaternion_geometric +/// @see ext_quaternion_relational +/// @see ext_quaternion_transform +/// @see ext_quaternion_trigonometric + +#pragma once + +// Dependency: +#include "../detail/type_quat.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_float extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_float + /// @{ + + /// Quaternion of single-precision floating-point numbers. + typedef qua quat; + + /// @} +} //namespace glm + diff --git a/NothinFancy/dep/include/glm/ext/quaternion_float_precision.hpp b/NothinFancy/dep/include/glm/ext/quaternion_float_precision.hpp new file mode 100644 index 0000000..f9e4f5c --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_float_precision.hpp @@ -0,0 +1,36 @@ +/// @ref ext_quaternion_float_precision +/// @file glm/ext/quaternion_float_precision.hpp +/// +/// @defgroup ext_quaternion_float_precision GLM_EXT_quaternion_float_precision +/// @ingroup ext +/// +/// Exposes single-precision floating point quaternion type with various precision in term of ULPs. +/// +/// Include to use the features of this extension. + +#pragma once + +// Dependency: +#include "../detail/type_quat.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_float_precision extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_float_precision + /// @{ + + /// Quaternion of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef qua lowp_quat; + + /// Quaternion of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef qua mediump_quat; + + /// Quaternion of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef qua highp_quat; + + /// @} +} //namespace glm + diff --git a/NothinFancy/dep/include/glm/ext/quaternion_geometric.hpp b/NothinFancy/dep/include/glm/ext/quaternion_geometric.hpp new file mode 100644 index 0000000..6d98bbe --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_geometric.hpp @@ -0,0 +1,70 @@ +/// @ref ext_quaternion_geometric +/// @file glm/ext/quaternion_geometric.hpp +/// +/// @defgroup ext_quaternion_geometric GLM_EXT_quaternion_geometric +/// @ingroup ext +/// +/// Provides geometric functions for quaternion types +/// +/// Include to use the features of this extension. +/// +/// @see core_geometric +/// @see ext_quaternion_float +/// @see ext_quaternion_double + +#pragma once + +// Dependency: +#include "../geometric.hpp" +#include "../exponential.hpp" +#include "../ext/vector_relational.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_geometric extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_geometric + /// @{ + + /// Returns the norm of a quaternions + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_geometric + template + GLM_FUNC_DECL T length(qua const& q); + + /// Returns the normalized quaternion. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_geometric + template + GLM_FUNC_DECL qua normalize(qua const& q); + + /// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ... + /// + /// @tparam T Floating-point scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_geometric + template + GLM_FUNC_DECL T dot(qua const& x, qua const& y); + + /// Compute a cross product. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_geometric + template + GLM_FUNC_QUALIFIER qua cross(qua const& q1, qua const& q2); + + /// @} +} //namespace glm + +#include "quaternion_geometric.inl" diff --git a/NothinFancy/dep/include/glm/ext/quaternion_geometric.inl b/NothinFancy/dep/include/glm/ext/quaternion_geometric.inl new file mode 100644 index 0000000..e155ac5 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_geometric.inl @@ -0,0 +1,36 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER T dot(qua const& x, qua const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'dot' accepts only floating-point inputs"); + return detail::compute_dot, T, detail::is_aligned::value>::call(x, y); + } + + template + GLM_FUNC_QUALIFIER T length(qua const& q) + { + return glm::sqrt(dot(q, q)); + } + + template + GLM_FUNC_QUALIFIER qua normalize(qua const& q) + { + T len = length(q); + if(len <= static_cast(0)) // Problem + return qua(static_cast(1), static_cast(0), static_cast(0), static_cast(0)); + T oneOverLen = static_cast(1) / len; + return qua(q.w * oneOverLen, q.x * oneOverLen, q.y * oneOverLen, q.z * oneOverLen); + } + + template + GLM_FUNC_QUALIFIER qua cross(qua const& q1, qua const& q2) + { + return qua( + q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z, + q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y, + q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z, + q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x); + } +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/ext/quaternion_relational.hpp b/NothinFancy/dep/include/glm/ext/quaternion_relational.hpp new file mode 100644 index 0000000..7aa121d --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_relational.hpp @@ -0,0 +1,62 @@ +/// @ref ext_quaternion_relational +/// @file glm/ext/quaternion_relational.hpp +/// +/// @defgroup ext_quaternion_relational GLM_EXT_quaternion_relational +/// @ingroup ext +/// +/// Exposes comparison functions for quaternion types that take a user defined epsilon values. +/// +/// Include to use the features of this extension. +/// +/// @see core_vector_relational +/// @see ext_vector_relational +/// @see ext_matrix_relational +/// @see ext_quaternion_float +/// @see ext_quaternion_double + +#pragma once + +// Dependency: +#include "../vector_relational.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_relational extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_relational + /// @{ + + /// Returns the component-wise comparison of result x == y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> equal(qua const& x, qua const& y); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> equal(qua const& x, qua const& y, T epsilon); + + /// Returns the component-wise comparison of result x != y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> notEqual(qua const& x, qua const& y); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> notEqual(qua const& x, qua const& y, T epsilon); + + /// @} +} //namespace glm + +#include "quaternion_relational.inl" diff --git a/NothinFancy/dep/include/glm/ext/quaternion_relational.inl b/NothinFancy/dep/include/glm/ext/quaternion_relational.inl new file mode 100644 index 0000000..b1713e9 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_relational.inl @@ -0,0 +1,35 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> equal(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] == y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> equal(qua const& x, qua const& y, T epsilon) + { + vec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); + return lessThan(abs(v), vec<4, T, Q>(epsilon)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> notEqual(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] != y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> notEqual(qua const& x, qua const& y, T epsilon) + { + vec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); + return greaterThanEqual(abs(v), vec<4, T, Q>(epsilon)); + } +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/ext/quaternion_transform.hpp b/NothinFancy/dep/include/glm/ext/quaternion_transform.hpp new file mode 100644 index 0000000..a9cc5c2 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_transform.hpp @@ -0,0 +1,47 @@ +/// @ref ext_quaternion_transform +/// @file glm/ext/quaternion_transform.hpp +/// +/// @defgroup ext_quaternion_transform GLM_EXT_quaternion_transform +/// @ingroup ext +/// +/// Provides transformation functions for quaternion types +/// +/// Include to use the features of this extension. +/// +/// @see ext_quaternion_float +/// @see ext_quaternion_double +/// @see ext_quaternion_exponential +/// @see ext_quaternion_geometric +/// @see ext_quaternion_relational +/// @see ext_quaternion_trigonometric + +#pragma once + +// Dependency: +#include "../common.hpp" +#include "../trigonometric.hpp" +#include "../geometric.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_transform extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_transform + /// @{ + + /// Rotates a quaternion from a vector of 3 components axis and an angle. + /// + /// @param q Source orientation + /// @param angle Angle expressed in radians. + /// @param axis Axis of the rotation + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL qua rotate(qua const& q, T const& angle, vec<3, T, Q> const& axis); + /// @} +} //namespace glm + +#include "quaternion_transform.inl" diff --git a/NothinFancy/dep/include/glm/ext/quaternion_transform.inl b/NothinFancy/dep/include/glm/ext/quaternion_transform.inl new file mode 100644 index 0000000..b87ecb6 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_transform.inl @@ -0,0 +1,24 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER qua rotate(qua const& q, T const& angle, vec<3, T, Q> const& v) + { + vec<3, T, Q> Tmp = v; + + // Axis of rotation must be normalised + T len = glm::length(Tmp); + if(abs(len - static_cast(1)) > static_cast(0.001)) + { + T oneOverLen = static_cast(1) / len; + Tmp.x *= oneOverLen; + Tmp.y *= oneOverLen; + Tmp.z *= oneOverLen; + } + + T const AngleRad(angle); + T const Sin = sin(AngleRad * static_cast(0.5)); + + return q * qua(cos(AngleRad * static_cast(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin); + } +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/ext/quaternion_trigonometric.hpp b/NothinFancy/dep/include/glm/ext/quaternion_trigonometric.hpp new file mode 100644 index 0000000..76cea27 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_trigonometric.hpp @@ -0,0 +1,63 @@ +/// @ref ext_quaternion_trigonometric +/// @file glm/ext/quaternion_trigonometric.hpp +/// +/// @defgroup ext_quaternion_trigonometric GLM_EXT_quaternion_trigonometric +/// @ingroup ext +/// +/// Provides trigonometric functions for quaternion types +/// +/// Include to use the features of this extension. +/// +/// @see ext_quaternion_float +/// @see ext_quaternion_double +/// @see ext_quaternion_exponential +/// @see ext_quaternion_geometric +/// @see ext_quaternion_relational +/// @see ext_quaternion_transform + +#pragma once + +// Dependency: +#include "../trigonometric.hpp" +#include "../exponential.hpp" +#include "scalar_constants.hpp" +#include "vector_relational.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_trigonometric extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_trigonometric + /// @{ + + /// Returns the quaternion rotation angle. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL T angle(qua const& x); + + /// Returns the q rotation axis. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL vec<3, T, Q> axis(qua const& x); + + /// Build a quaternion from an angle and a normalized axis. + /// + /// @param angle Angle expressed in radians. + /// @param axis Axis of the quaternion, must be normalized. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua angleAxis(T const& angle, vec<3, T, Q> const& axis); + + /// @} +} //namespace glm + +#include "quaternion_trigonometric.inl" diff --git a/NothinFancy/dep/include/glm/ext/quaternion_trigonometric.inl b/NothinFancy/dep/include/glm/ext/quaternion_trigonometric.inl new file mode 100644 index 0000000..06b7c4c --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/quaternion_trigonometric.inl @@ -0,0 +1,34 @@ +#include "scalar_constants.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T angle(qua const& x) + { + if (abs(x.w) > cos_one_over_two()) + { + return asin(sqrt(x.x * x.x + x.y * x.y + x.z * x.z)) * static_cast(2); + } + + return acos(x.w) * static_cast(2); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> axis(qua const& x) + { + T const tmp1 = static_cast(1) - x.w * x.w; + if(tmp1 <= static_cast(0)) + return vec<3, T, Q>(0, 0, 1); + T const tmp2 = static_cast(1) / sqrt(tmp1); + return vec<3, T, Q>(x.x * tmp2, x.y * tmp2, x.z * tmp2); + } + + template + GLM_FUNC_QUALIFIER qua angleAxis(T const& angle, vec<3, T, Q> const& v) + { + T const a(angle); + T const s = glm::sin(a * static_cast(0.5)); + + return qua(glm::cos(a * static_cast(0.5)), v * s); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/scalar_common.hpp b/NothinFancy/dep/include/glm/ext/scalar_common.hpp new file mode 100644 index 0000000..aa5a180 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_common.hpp @@ -0,0 +1,157 @@ +/// @ref ext_scalar_common +/// @file glm/ext/scalar_common.hpp +/// +/// @defgroup ext_scalar_common GLM_EXT_scalar_common +/// @ingroup ext +/// +/// Exposes min and max functions for 3 to 4 scalar parameters. +/// +/// Include to use the features of this extension. +/// +/// @see core_func_common +/// @see ext_vector_common + +#pragma once + +// Dependency: +#include "../common.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_common extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_scalar_common + /// @{ + + /// Returns the minimum component-wise values of 3 inputs + /// + /// @tparam T A floating-point scalar type. + /// + /// @see ext_scalar_common + template + GLM_FUNC_DECL T min(T a, T b, T c); + + /// Returns the minimum component-wise values of 4 inputs + /// + /// @tparam T A floating-point scalar type. + /// + /// @see ext_scalar_common + template + GLM_FUNC_DECL T min(T a, T b, T c, T d); + + /// Returns the maximum component-wise values of 3 inputs + /// + /// @tparam T A floating-point scalar type. + /// + /// @see ext_scalar_common + template + GLM_FUNC_DECL T max(T a, T b, T c); + + /// Returns the maximum component-wise values of 4 inputs + /// + /// @tparam T A floating-point scalar type. + /// + /// @see ext_scalar_common + template + GLM_FUNC_DECL T max(T a, T b, T c, T d); + + /// Returns the minimum component-wise values of 2 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmin documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmin(T a, T b); + + /// Returns the minimum component-wise values of 3 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmin documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmin(T a, T b, T c); + + /// Returns the minimum component-wise values of 4 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmin documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmin(T a, T b, T c, T d); + + /// Returns the maximum component-wise values of 2 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmax documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmax(T a, T b); + + /// Returns the maximum component-wise values of 3 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmax documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmax(T a, T b, T C); + + /// Returns the maximum component-wise values of 4 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmax documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmax(T a, T b, T C, T D); + + /// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam genType Floating-point scalar types. + /// + /// @see ext_scalar_common + template + GLM_FUNC_DECL genType fclamp(genType x, genType minVal, genType maxVal); + + /// Simulate GL_CLAMP OpenGL wrap mode + /// + /// @tparam genType Floating-point scalar types. + /// + /// @see ext_scalar_common extension. + template + GLM_FUNC_DECL genType clamp(genType const& Texcoord); + + /// Simulate GL_REPEAT OpenGL wrap mode + /// + /// @tparam genType Floating-point scalar types. + /// + /// @see ext_scalar_common extension. + template + GLM_FUNC_DECL genType repeat(genType const& Texcoord); + + /// Simulate GL_MIRRORED_REPEAT OpenGL wrap mode + /// + /// @tparam genType Floating-point scalar types. + /// + /// @see ext_scalar_common extension. + template + GLM_FUNC_DECL genType mirrorClamp(genType const& Texcoord); + + /// Simulate GL_MIRROR_REPEAT OpenGL wrap mode + /// + /// @tparam genType Floating-point scalar types. + /// + /// @see ext_scalar_common extension. + template + GLM_FUNC_DECL genType mirrorRepeat(genType const& Texcoord); + + /// @} +}//namespace glm + +#include "scalar_common.inl" diff --git a/NothinFancy/dep/include/glm/ext/scalar_common.inl b/NothinFancy/dep/include/glm/ext/scalar_common.inl new file mode 100644 index 0000000..7d9207a --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_common.inl @@ -0,0 +1,152 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER T min(T a, T b, T c) + { + return glm::min(glm::min(a, b), c); + } + + template + GLM_FUNC_QUALIFIER T min(T a, T b, T c, T d) + { + return glm::min(glm::min(a, b), glm::min(c, d)); + } + + template + GLM_FUNC_QUALIFIER T max(T a, T b, T c) + { + return glm::max(glm::max(a, b), c); + } + + template + GLM_FUNC_QUALIFIER T max(T a, T b, T c, T d) + { + return glm::max(glm::max(a, b), glm::max(c, d)); + } + +# if GLM_HAS_CXX11_STL + using std::fmin; +# else + template + GLM_FUNC_QUALIFIER T fmin(T a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point input"); + + if (isnan(a)) + return b; + return min(a, b); + } +# endif + + template + GLM_FUNC_QUALIFIER T fmin(T a, T b, T c) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point input"); + + if (isnan(a)) + return fmin(b, c); + if (isnan(b)) + return fmin(a, c); + if (isnan(c)) + return min(a, b); + return min(a, b, c); + } + + template + GLM_FUNC_QUALIFIER T fmin(T a, T b, T c, T d) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point input"); + + if (isnan(a)) + return fmin(b, c, d); + if (isnan(b)) + return min(a, fmin(c, d)); + if (isnan(c)) + return fmin(min(a, b), d); + if (isnan(d)) + return min(a, b, c); + return min(a, b, c, d); + } + + +# if GLM_HAS_CXX11_STL + using std::fmax; +# else + template + GLM_FUNC_QUALIFIER T fmax(T a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point input"); + + if (isnan(a)) + return b; + return max(a, b); + } +# endif + + template + GLM_FUNC_QUALIFIER T fmax(T a, T b, T c) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point input"); + + if (isnan(a)) + return fmax(b, c); + if (isnan(b)) + return fmax(a, c); + if (isnan(c)) + return max(a, b); + return max(a, b, c); + } + + template + GLM_FUNC_QUALIFIER T fmax(T a, T b, T c, T d) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point input"); + + if (isnan(a)) + return fmax(b, c, d); + if (isnan(b)) + return max(a, fmax(c, d)); + if (isnan(c)) + return fmax(max(a, b), d); + if (isnan(d)) + return max(a, b, c); + return max(a, b, c, d); + } + + // fclamp + template + GLM_FUNC_QUALIFIER genType fclamp(genType x, genType minVal, genType maxVal) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fclamp' only accept floating-point or integer inputs"); + return fmin(fmax(x, minVal), maxVal); + } + + template + GLM_FUNC_QUALIFIER genType clamp(genType const& Texcoord) + { + return glm::clamp(Texcoord, static_cast(0), static_cast(1)); + } + + template + GLM_FUNC_QUALIFIER genType repeat(genType const& Texcoord) + { + return glm::fract(Texcoord); + } + + template + GLM_FUNC_QUALIFIER genType mirrorClamp(genType const& Texcoord) + { + return glm::fract(glm::abs(Texcoord)); + } + + template + GLM_FUNC_QUALIFIER genType mirrorRepeat(genType const& Texcoord) + { + genType const Abs = glm::abs(Texcoord); + genType const Clamp = glm::mod(glm::floor(Abs), static_cast(2)); + genType const Floor = glm::floor(Abs); + genType const Rest = Abs - Floor; + genType const Mirror = Clamp + Rest; + return mix(Rest, static_cast(1) - Rest, Mirror >= static_cast(1)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/scalar_constants.hpp b/NothinFancy/dep/include/glm/ext/scalar_constants.hpp new file mode 100644 index 0000000..74e210d --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_constants.hpp @@ -0,0 +1,40 @@ +/// @ref ext_scalar_constants +/// @file glm/ext/scalar_constants.hpp +/// +/// @defgroup ext_scalar_constants GLM_EXT_scalar_constants +/// @ingroup ext +/// +/// Provides a list of constants and precomputed useful values. +/// +/// Include to use the features of this extension. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_constants extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_scalar_constants + /// @{ + + /// Return the epsilon constant for floating point types. + template + GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon(); + + /// Return the pi constant for floating point types. + template + GLM_FUNC_DECL GLM_CONSTEXPR genType pi(); + + /// Return the value of cos(1 / 2) for floating point types. + template + GLM_FUNC_DECL GLM_CONSTEXPR genType cos_one_over_two(); + + /// @} +} //namespace glm + +#include "scalar_constants.inl" diff --git a/NothinFancy/dep/include/glm/ext/scalar_constants.inl b/NothinFancy/dep/include/glm/ext/scalar_constants.inl new file mode 100644 index 0000000..b475adf --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_constants.inl @@ -0,0 +1,24 @@ +#include + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType epsilon() + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'epsilon' only accepts floating-point inputs"); + return std::numeric_limits::epsilon(); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType pi() + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'pi' only accepts floating-point inputs"); + return static_cast(3.14159265358979323846264338327950288); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType cos_one_over_two() + { + return genType(0.877582561890372716130286068203503191); + } +} //namespace glm diff --git a/NothinFancy/dep/include/glm/ext/scalar_int_sized.hpp b/NothinFancy/dep/include/glm/ext/scalar_int_sized.hpp new file mode 100644 index 0000000..8e9c511 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_int_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_scalar_int_sized +/// @file glm/ext/scalar_int_sized.hpp +/// +/// @defgroup ext_scalar_int_sized GLM_EXT_scalar_int_sized +/// @ingroup ext +/// +/// Exposes sized signed integer scalar types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_uint_sized + +#pragma once + +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_int_sized extension included") +#endif + +namespace glm{ +namespace detail +{ +# if GLM_HAS_EXTENDED_INTEGER_TYPE + typedef std::int8_t int8; + typedef std::int16_t int16; + typedef std::int32_t int32; +# else + typedef signed char int8; + typedef signed short int16; + typedef signed int int32; +#endif// + + template<> + struct is_int + { + enum test {value = ~0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; +}//namespace detail + + + /// @addtogroup ext_scalar_int_sized + /// @{ + + /// 8 bit signed integer type. + typedef detail::int8 int8; + + /// 16 bit signed integer type. + typedef detail::int16 int16; + + /// 32 bit signed integer type. + typedef detail::int32 int32; + + /// 64 bit signed integer type. + typedef detail::int64 int64; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/scalar_integer.hpp b/NothinFancy/dep/include/glm/ext/scalar_integer.hpp new file mode 100644 index 0000000..a2ca8a2 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_integer.hpp @@ -0,0 +1,92 @@ +/// @ref ext_scalar_integer +/// @file glm/ext/scalar_integer.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_scalar_integer GLM_EXT_scalar_integer +/// @ingroup ext +/// +/// Include to use the features of this extension. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_vectorize.hpp" +#include "../detail/type_float.hpp" +#include "../vector_relational.hpp" +#include "../common.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_integer extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_scalar_integer + /// @{ + + /// Return true if the value is a power of two number. + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL bool isPowerOfTwo(genIUType v); + + /// Return the power of two number which value is just higher the input value, + /// round up to a power of two. + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL genIUType nextPowerOfTwo(genIUType v); + + /// Return the power of two number which value is just lower the input value, + /// round down to a power of two. + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL genIUType prevPowerOfTwo(genIUType v); + + /// Return true if the 'Value' is a multiple of 'Multiple'. + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL bool isMultiple(genIUType v, genIUType Multiple); + + /// Higher multiple number of Source. + /// + /// @tparam genIUType Integer scalar or vector types. + /// + /// @param v Source value to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL genIUType nextMultiple(genIUType v, genIUType Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam genIUType Integer scalar or vector types. + /// + /// @param v Source value to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL genIUType prevMultiple(genIUType v, genIUType Multiple); + + /// Returns the bit number of the Nth significant bit set to + /// 1 in the binary representation of value. + /// If value bitcount is less than the Nth significant bit, -1 will be returned. + /// + /// @tparam genIUType Signed or unsigned integer scalar types. + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL int findNSB(genIUType x, int significantBitCount); + + /// @} +} //namespace glm + +#include "scalar_integer.inl" diff --git a/NothinFancy/dep/include/glm/ext/scalar_integer.inl b/NothinFancy/dep/include/glm/ext/scalar_integer.inl new file mode 100644 index 0000000..efba960 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_integer.inl @@ -0,0 +1,243 @@ +#include "../integer.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_ceilShift + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T) + { + return v; + } + }; + + template + struct compute_ceilShift + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T Shift) + { + return v | (v >> Shift); + } + }; + + template + struct compute_ceilPowerOfTwo + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + GLM_STATIC_ASSERT(!std::numeric_limits::is_iec559, "'ceilPowerOfTwo' only accept integer scalar or vector inputs"); + + vec const Sign(sign(x)); + + vec v(abs(x)); + + v = v - static_cast(1); + v = v | (v >> static_cast(1)); + v = v | (v >> static_cast(2)); + v = v | (v >> static_cast(4)); + v = compute_ceilShift= 2>::call(v, 8); + v = compute_ceilShift= 4>::call(v, 16); + v = compute_ceilShift= 8>::call(v, 32); + return (v + static_cast(1)) * Sign; + } + }; + + template + struct compute_ceilPowerOfTwo + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + GLM_STATIC_ASSERT(!std::numeric_limits::is_iec559, "'ceilPowerOfTwo' only accept integer scalar or vector inputs"); + + vec v(x); + + v = v - static_cast(1); + v = v | (v >> static_cast(1)); + v = v | (v >> static_cast(2)); + v = v | (v >> static_cast(4)); + v = compute_ceilShift= 2>::call(v, 8); + v = compute_ceilShift= 4>::call(v, 16); + v = compute_ceilShift= 8>::call(v, 32); + return v + static_cast(1); + } + }; + + template + struct compute_ceilMultiple{}; + + template<> + struct compute_ceilMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if(Source > genType(0)) + return Source + (Multiple - std::fmod(Source, Multiple)); + else + return Source + std::fmod(-Source, Multiple); + } + }; + + template<> + struct compute_ceilMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + genType Tmp = Source - genType(1); + return Tmp + (Multiple - (Tmp % Multiple)); + } + }; + + template<> + struct compute_ceilMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + assert(Multiple > genType(0)); + if(Source > genType(0)) + { + genType Tmp = Source - genType(1); + return Tmp + (Multiple - (Tmp % Multiple)); + } + else + return Source + (-Source % Multiple); + } + }; + + template + struct compute_floorMultiple{}; + + template<> + struct compute_floorMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if(Source >= genType(0)) + return Source - std::fmod(Source, Multiple); + else + return Source - std::fmod(Source, Multiple) - Multiple; + } + }; + + template<> + struct compute_floorMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if(Source >= genType(0)) + return Source - Source % Multiple; + else + { + genType Tmp = Source + genType(1); + return Tmp - Tmp % Multiple - Multiple; + } + } + }; + + template<> + struct compute_floorMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if(Source >= genType(0)) + return Source - Source % Multiple; + else + { + genType Tmp = Source + genType(1); + return Tmp - Tmp % Multiple - Multiple; + } + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER bool isPowerOfTwo(genIUType Value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'isPowerOfTwo' only accept integer inputs"); + + genIUType const Result = glm::abs(Value); + return !(Result & (Result - 1)); + } + + template + GLM_FUNC_QUALIFIER genIUType nextPowerOfTwo(genIUType value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'nextPowerOfTwo' only accept integer inputs"); + + return detail::compute_ceilPowerOfTwo<1, genIUType, defaultp, std::numeric_limits::is_signed>::call(vec<1, genIUType, defaultp>(value)).x; + } + + template + GLM_FUNC_QUALIFIER genIUType prevPowerOfTwo(genIUType value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'prevPowerOfTwo' only accept integer inputs"); + + return isPowerOfTwo(value) ? value : static_cast(static_cast(1) << static_cast(findMSB(value))); + } + + template + GLM_FUNC_QUALIFIER bool isMultiple(genIUType Value, genIUType Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'isMultiple' only accept integer inputs"); + + return isMultiple(vec<1, genIUType>(Value), vec<1, genIUType>(Multiple)).x; + } + + template + GLM_FUNC_QUALIFIER genIUType nextMultiple(genIUType Source, genIUType Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'nextMultiple' only accept integer inputs"); + + return detail::compute_ceilMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER genIUType prevMultiple(genIUType Source, genIUType Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'prevMultiple' only accept integer inputs"); + + return detail::compute_floorMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER int findNSB(genIUType x, int significantBitCount) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findNSB' only accept integer inputs"); + + if(bitCount(x) < significantBitCount) + return -1; + + genIUType const One = static_cast(1); + int bitPos = 0; + + genIUType key = x; + int nBitCount = significantBitCount; + int Step = sizeof(x) * 8 / 2; + while (key > One) + { + genIUType Mask = static_cast((One << Step) - One); + genIUType currentKey = key & Mask; + int currentBitCount = bitCount(currentKey); + if (nBitCount > currentBitCount) + { + nBitCount -= currentBitCount; + bitPos += Step; + key >>= static_cast(Step); + } + else + { + key = key & Mask; + } + + Step >>= 1; + } + + return static_cast(bitPos); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/scalar_packing.hpp b/NothinFancy/dep/include/glm/ext/scalar_packing.hpp new file mode 100644 index 0000000..18b85b7 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_packing.hpp @@ -0,0 +1,32 @@ +/// @ref ext_scalar_packing +/// @file glm/ext/scalar_packing.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_scalar_packing GLM_EXT_scalar_packing +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// This extension provides a set of function to convert scalar values to packed +/// formats. + +#pragma once + +// Dependency: +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_packing extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_scalar_packing + /// @{ + + + /// @} +}// namespace glm + +#include "scalar_packing.inl" diff --git a/NothinFancy/dep/include/glm/ext/scalar_packing.inl b/NothinFancy/dep/include/glm/ext/scalar_packing.inl new file mode 100644 index 0000000..e69de29 diff --git a/NothinFancy/dep/include/glm/ext/scalar_relational.hpp b/NothinFancy/dep/include/glm/ext/scalar_relational.hpp new file mode 100644 index 0000000..3076a5e --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_relational.hpp @@ -0,0 +1,65 @@ +/// @ref ext_scalar_relational +/// @file glm/ext/scalar_relational.hpp +/// +/// @defgroup ext_scalar_relational GLM_EXT_scalar_relational +/// @ingroup ext +/// +/// Exposes comparison functions for scalar types that take a user defined epsilon values. +/// +/// Include to use the features of this extension. +/// +/// @see core_vector_relational +/// @see ext_vector_relational +/// @see ext_matrix_relational + +#pragma once + +// Dependencies +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_relational extension included") +#endif + +namespace glm +{ + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam genType Floating-point or integer scalar types + template + GLM_FUNC_DECL GLM_CONSTEXPR bool equal(genType const& x, genType const& y, genType const& epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam genType Floating-point or integer scalar types + template + GLM_FUNC_DECL GLM_CONSTEXPR bool notEqual(genType const& x, genType const& y, genType const& epsilon); + + /// Returns the component-wise comparison between two scalars in term of ULPs. + /// True if this expression is satisfied. + /// + /// @param x First operand. + /// @param y Second operand. + /// @param ULPs Maximum difference in ULPs between the two operators to consider them equal. + /// + /// @tparam genType Floating-point or integer scalar types + template + GLM_FUNC_DECL GLM_CONSTEXPR bool equal(genType const& x, genType const& y, int ULPs); + + /// Returns the component-wise comparison between two scalars in term of ULPs. + /// True if this expression is not satisfied. + /// + /// @param x First operand. + /// @param y Second operand. + /// @param ULPs Maximum difference in ULPs between the two operators to consider them not equal. + /// + /// @tparam genType Floating-point or integer scalar types + template + GLM_FUNC_DECL GLM_CONSTEXPR bool notEqual(genType const& x, genType const& y, int ULPs); + + /// @} +}//namespace glm + +#include "scalar_relational.inl" diff --git a/NothinFancy/dep/include/glm/ext/scalar_relational.inl b/NothinFancy/dep/include/glm/ext/scalar_relational.inl new file mode 100644 index 0000000..c85583e --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_relational.inl @@ -0,0 +1,40 @@ +#include "../common.hpp" +#include "../ext/scalar_int_sized.hpp" +#include "../ext/scalar_uint_sized.hpp" +#include "../detail/type_float.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool equal(genType const& x, genType const& y, genType const& epsilon) + { + return abs(x - y) <= epsilon; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool notEqual(genType const& x, genType const& y, genType const& epsilon) + { + return abs(x - y) > epsilon; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool equal(genType const& x, genType const& y, int MaxULPs) + { + detail::float_t const a(x); + detail::float_t const b(y); + + // Different signs means they do not match. + if(a.negative() != b.negative()) + return false; + + // Find the difference in ULPs. + typename detail::float_t::int_type const DiffULPs = abs(a.i - b.i); + return DiffULPs <= MaxULPs; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool notEqual(genType const& x, genType const& y, int ULPs) + { + return !equal(x, y, ULPs); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/scalar_uint_sized.hpp b/NothinFancy/dep/include/glm/ext/scalar_uint_sized.hpp new file mode 100644 index 0000000..fd5267f --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_uint_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_scalar_uint_sized +/// @file glm/ext/scalar_uint_sized.hpp +/// +/// @defgroup ext_scalar_uint_sized GLM_EXT_scalar_uint_sized +/// @ingroup ext +/// +/// Exposes sized unsigned integer scalar types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_int_sized + +#pragma once + +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_uint_sized extension included") +#endif + +namespace glm{ +namespace detail +{ +# if GLM_HAS_EXTENDED_INTEGER_TYPE + typedef std::uint8_t uint8; + typedef std::uint16_t uint16; + typedef std::uint32_t uint32; +# else + typedef unsigned char uint8; + typedef unsigned short uint16; + typedef unsigned int uint32; +#endif + + template<> + struct is_int + { + enum test {value = ~0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; +}//namespace detail + + + /// @addtogroup ext_scalar_uint_sized + /// @{ + + /// 8 bit unsigned integer type. + typedef detail::uint8 uint8; + + /// 16 bit unsigned integer type. + typedef detail::uint16 uint16; + + /// 32 bit unsigned integer type. + typedef detail::uint32 uint32; + + /// 64 bit unsigned integer type. + typedef detail::uint64 uint64; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/scalar_ulp.hpp b/NothinFancy/dep/include/glm/ext/scalar_ulp.hpp new file mode 100644 index 0000000..941ada3 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_ulp.hpp @@ -0,0 +1,74 @@ +/// @ref ext_scalar_ulp +/// @file glm/ext/scalar_ulp.hpp +/// +/// @defgroup ext_scalar_ulp GLM_EXT_scalar_ulp +/// @ingroup ext +/// +/// Allow the measurement of the accuracy of a function against a reference +/// implementation. This extension works on floating-point data and provide results +/// in ULP. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_ulp +/// @see ext_scalar_relational + +#pragma once + +// Dependencies +#include "../ext/scalar_int_sized.hpp" +#include "../common.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_ulp extension included") +#endif + +namespace glm +{ + /// Return the next ULP value(s) after the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL genType nextFloat(genType x); + + /// Return the previous ULP value(s) before the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL genType prevFloat(genType x); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL genType nextFloat(genType x, int ULPs); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL genType prevFloat(genType x, int ULPs); + + /// Return the distance in the number of ULP between 2 single-precision floating-point scalars. + /// + /// @see ext_scalar_ulp + GLM_FUNC_DECL int floatDistance(float x, float y); + + /// Return the distance in the number of ULP between 2 double-precision floating-point scalars. + /// + /// @see ext_scalar_ulp + GLM_FUNC_DECL int64 floatDistance(double x, double y); + + /// @} +}//namespace glm + +#include "scalar_ulp.inl" diff --git a/NothinFancy/dep/include/glm/ext/scalar_ulp.inl b/NothinFancy/dep/include/glm/ext/scalar_ulp.inl new file mode 100644 index 0000000..308df15 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/scalar_ulp.inl @@ -0,0 +1,284 @@ +/// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +/// +/// Developed at SunPro, a Sun Microsystems, Inc. business. +/// Permission to use, copy, modify, and distribute this +/// software is freely granted, provided that this notice +/// is preserved. + +#include "../detail/type_float.hpp" +#include "../ext/scalar_constants.hpp" +#include +#include + +#if(GLM_COMPILER & GLM_COMPILER_VC) +# pragma warning(push) +# pragma warning(disable : 4127) +#endif + +typedef union +{ + float value; + /* FIXME: Assumes 32 bit int. */ + unsigned int word; +} ieee_float_shape_type; + +typedef union +{ + double value; + struct + { + int lsw; + int msw; + } parts; +} ieee_double_shape_type; + +#define GLM_EXTRACT_WORDS(ix0,ix1,d) \ + do { \ + ieee_double_shape_type ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ + } while (0) + +#define GLM_GET_FLOAT_WORD(i,d) \ + do { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } while (0) + +#define GLM_SET_FLOAT_WORD(d,i) \ + do { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } while (0) + +#define GLM_INSERT_WORDS(d,ix0,ix1) \ + do { \ + ieee_double_shape_type iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ + } while (0) + +namespace glm{ +namespace detail +{ + GLM_FUNC_QUALIFIER float nextafterf(float x, float y) + { + volatile float t; + int hx, hy, ix, iy; + + GLM_GET_FLOAT_WORD(hx, x); + GLM_GET_FLOAT_WORD(hy, y); + ix = hx & 0x7fffffff; // |x| + iy = hy & 0x7fffffff; // |y| + + if((ix > 0x7f800000) || // x is nan + (iy > 0x7f800000)) // y is nan + return x + y; + if(abs(y - x) <= epsilon()) + return y; // x=y, return y + if(ix == 0) + { // x == 0 + GLM_SET_FLOAT_WORD(x, (hy & 0x80000000) | 1);// return +-minsubnormal + t = x * x; + if(abs(t - x) <= epsilon()) + return t; + else + return x; // raise underflow flag + } + if(hx >= 0) + { // x > 0 + if(hx > hy) // x > y, x -= ulp + hx -= 1; + else // x < y, x += ulp + hx += 1; + } + else + { // x < 0 + if(hy >= 0 || hx > hy) // x < y, x -= ulp + hx -= 1; + else // x > y, x += ulp + hx += 1; + } + hy = hx & 0x7f800000; + if(hy >= 0x7f800000) + return x + x; // overflow + if(hy < 0x00800000) // underflow + { + t = x * x; + if(abs(t - x) > epsilon()) + { // raise underflow flag + GLM_SET_FLOAT_WORD(y, hx); + return y; + } + } + GLM_SET_FLOAT_WORD(x, hx); + return x; + } + + GLM_FUNC_QUALIFIER double nextafter(double x, double y) + { + volatile double t; + int hx, hy, ix, iy; + unsigned int lx, ly; + + GLM_EXTRACT_WORDS(hx, lx, x); + GLM_EXTRACT_WORDS(hy, ly, y); + ix = hx & 0x7fffffff; // |x| + iy = hy & 0x7fffffff; // |y| + + if(((ix >= 0x7ff00000) && ((ix - 0x7ff00000) | lx) != 0) || // x is nan + ((iy >= 0x7ff00000) && ((iy - 0x7ff00000) | ly) != 0)) // y is nan + return x + y; + if(abs(y - x) <= epsilon()) + return y; // x=y, return y + if((ix | lx) == 0) + { // x == 0 + GLM_INSERT_WORDS(x, hy & 0x80000000, 1); // return +-minsubnormal + t = x * x; + if(abs(t - x) <= epsilon()) + return t; + else + return x; // raise underflow flag + } + if(hx >= 0) { // x > 0 + if(hx > hy || ((hx == hy) && (lx > ly))) { // x > y, x -= ulp + if(lx == 0) hx -= 1; + lx -= 1; + } + else { // x < y, x += ulp + lx += 1; + if(lx == 0) hx += 1; + } + } + else { // x < 0 + if(hy >= 0 || hx > hy || ((hx == hy) && (lx > ly))){// x < y, x -= ulp + if(lx == 0) hx -= 1; + lx -= 1; + } + else { // x > y, x += ulp + lx += 1; + if(lx == 0) hx += 1; + } + } + hy = hx & 0x7ff00000; + if(hy >= 0x7ff00000) + return x + x; // overflow + if(hy < 0x00100000) + { // underflow + t = x * x; + if(abs(t - x) > epsilon()) + { // raise underflow flag + GLM_INSERT_WORDS(y, hx, lx); + return y; + } + } + GLM_INSERT_WORDS(x, hx, lx); + return x; + } +}//namespace detail +}//namespace glm + +#if(GLM_COMPILER & GLM_COMPILER_VC) +# pragma warning(pop) +#endif + +namespace glm +{ + template<> + GLM_FUNC_QUALIFIER float nextFloat(float x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::max()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafterf(x, FLT_MAX); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafterf(x, FLT_MAX); +# else + return nextafterf(x, FLT_MAX); +# endif + } + + template<> + GLM_FUNC_QUALIFIER double nextFloat(double x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::max()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafter(x, std::numeric_limits::max()); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafter(x, DBL_MAX); +# else + return nextafter(x, DBL_MAX); +# endif + } + + template + GLM_FUNC_QUALIFIER T nextFloat(T x, int ULPs) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'next_float' only accept floating-point input"); + assert(ULPs >= 0); + + T temp = x; + for(int i = 0; i < ULPs; ++i) + temp = nextFloat(temp); + return temp; + } + + GLM_FUNC_QUALIFIER float prevFloat(float x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::min()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafterf(x, FLT_MIN); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafterf(x, FLT_MIN); +# else + return nextafterf(x, FLT_MIN); +# endif + } + + GLM_FUNC_QUALIFIER double prevFloat(double x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::min()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return _nextafter(x, DBL_MIN); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafter(x, DBL_MIN); +# else + return nextafter(x, DBL_MIN); +# endif + } + + template + GLM_FUNC_QUALIFIER T prevFloat(T x, int ULPs) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'prev_float' only accept floating-point input"); + assert(ULPs >= 0); + + T temp = x; + for(int i = 0; i < ULPs; ++i) + temp = prevFloat(temp); + return temp; + } + + GLM_FUNC_QUALIFIER int floatDistance(float x, float y) + { + detail::float_t const a(x); + detail::float_t const b(y); + + return abs(a.i - b.i); + } + + GLM_FUNC_QUALIFIER int64 floatDistance(double x, double y) + { + detail::float_t const a(x); + detail::float_t const b(y); + + return abs(a.i - b.i); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_bool1.hpp b/NothinFancy/dep/include/glm/ext/vector_bool1.hpp new file mode 100644 index 0000000..002c320 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_bool1.hpp @@ -0,0 +1,30 @@ +/// @ref ext_vector_bool1 +/// @file glm/ext/vector_bool1.hpp +/// +/// @defgroup ext_vector_bool1 GLM_EXT_vector_bool1 +/// @ingroup ext +/// +/// Exposes bvec1 vector type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_bool1_precision extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_bool1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_bool1 + /// @{ + + /// 1 components vector of boolean. + typedef vec<1, bool, defaultp> bvec1; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_bool1_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_bool1_precision.hpp new file mode 100644 index 0000000..e62d3cf --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_bool1_precision.hpp @@ -0,0 +1,34 @@ +/// @ref ext_vector_bool1_precision +/// @file glm/ext/vector_bool1_precision.hpp +/// +/// @defgroup ext_vector_bool1_precision GLM_EXT_vector_bool1_precision +/// @ingroup ext +/// +/// Exposes highp_bvec1, mediump_bvec1 and lowp_bvec1 types. +/// +/// Include to use the features of this extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_bool1_precision extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_bool1_precision + /// @{ + + /// 1 component vector of bool values. + typedef vec<1, bool, highp> highp_bvec1; + + /// 1 component vector of bool values. + typedef vec<1, bool, mediump> mediump_bvec1; + + /// 1 component vector of bool values. + typedef vec<1, bool, lowp> lowp_bvec1; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_bool2.hpp b/NothinFancy/dep/include/glm/ext/vector_bool2.hpp new file mode 100644 index 0000000..52288b7 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_bool2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_bool2.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 2 components vector of boolean. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<2, bool, defaultp> bvec2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_bool2_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_bool2_precision.hpp new file mode 100644 index 0000000..4370933 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_bool2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_bool2_precision.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 2 components vector of high qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, bool, highp> highp_bvec2; + + /// 2 components vector of medium qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, bool, mediump> mediump_bvec2; + + /// 2 components vector of low qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, bool, lowp> lowp_bvec2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_bool3.hpp b/NothinFancy/dep/include/glm/ext/vector_bool3.hpp new file mode 100644 index 0000000..90a0b7e --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_bool3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_bool3.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 3 components vector of boolean. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<3, bool, defaultp> bvec3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_bool3_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_bool3_precision.hpp new file mode 100644 index 0000000..89cd2d3 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_bool3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_bool3_precision.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 3 components vector of high qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, bool, highp> highp_bvec3; + + /// 3 components vector of medium qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, bool, mediump> mediump_bvec3; + + /// 3 components vector of low qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, bool, lowp> lowp_bvec3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_bool4.hpp b/NothinFancy/dep/include/glm/ext/vector_bool4.hpp new file mode 100644 index 0000000..18aa71b --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_bool4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_bool4.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 4 components vector of boolean. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<4, bool, defaultp> bvec4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_bool4_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_bool4_precision.hpp new file mode 100644 index 0000000..79786e5 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_bool4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_bool4_precision.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 4 components vector of high qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, bool, highp> highp_bvec4; + + /// 4 components vector of medium qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, bool, mediump> mediump_bvec4; + + /// 4 components vector of low qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, bool, lowp> lowp_bvec4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_common.hpp b/NothinFancy/dep/include/glm/ext/vector_common.hpp new file mode 100644 index 0000000..521ec01 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_common.hpp @@ -0,0 +1,204 @@ +/// @ref ext_vector_common +/// @file glm/ext/vector_common.hpp +/// +/// @defgroup ext_vector_common GLM_EXT_vector_common +/// @ingroup ext +/// +/// Exposes min and max functions for 3 to 4 vector parameters. +/// +/// Include to use the features of this extension. +/// +/// @see core_common +/// @see ext_scalar_common + +#pragma once + +// Dependency: +#include "../ext/scalar_common.hpp" +#include "../common.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_common extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_common + /// @{ + + /// Return the minimum component-wise values of 3 inputs + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec min(vec const& a, vec const& b, vec const& c); + + /// Return the minimum component-wise values of 4 inputs + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec min(vec const& a, vec const& b, vec const& c, vec const& d); + + /// Return the maximum component-wise values of 3 inputs + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec max(vec const& x, vec const& y, vec const& z); + + /// Return the maximum component-wise values of 4 inputs + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec max( vec const& x, vec const& y, vec const& z, vec const& w); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmin documentation + template + GLM_FUNC_DECL vec fmin(vec const& x, T y); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmin documentation + template + GLM_FUNC_DECL vec fmin(vec const& x, vec const& y); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmin documentation + template + GLM_FUNC_DECL vec fmin(vec const& a, vec const& b, vec const& c); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmin documentation + template + GLM_FUNC_DECL vec fmin(vec const& a, vec const& b, vec const& c, vec const& d); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmax documentation + template + GLM_FUNC_DECL vec fmax(vec const& a, T b); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmax documentation + template + GLM_FUNC_DECL vec fmax(vec const& a, vec const& b); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmax documentation + template + GLM_FUNC_DECL vec fmax(vec const& a, vec const& b, vec const& c); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmax documentation + template + GLM_FUNC_DECL vec fmax(vec const& a, vec const& b, vec const& c, vec const& d); + + /// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common + template + GLM_FUNC_DECL vec fclamp(vec const& x, T minVal, T maxVal); + + /// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common + template + GLM_FUNC_DECL vec fclamp(vec const& x, vec const& minVal, vec const& maxVal); + + /// Simulate GL_CLAMP OpenGL wrap mode + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common extension. + template + GLM_FUNC_DECL vec clamp(vec const& Texcoord); + + /// Simulate GL_REPEAT OpenGL wrap mode + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common extension. + template + GLM_FUNC_DECL vec repeat(vec const& Texcoord); + + /// Simulate GL_MIRRORED_REPEAT OpenGL wrap mode + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common extension. + template + GLM_FUNC_DECL vec mirrorClamp(vec const& Texcoord); + + /// Simulate GL_MIRROR_REPEAT OpenGL wrap mode + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common extension. + template + GLM_FUNC_DECL vec mirrorRepeat(vec const& Texcoord); + + /// @} +}//namespace glm + +#include "vector_common.inl" diff --git a/NothinFancy/dep/include/glm/ext/vector_common.inl b/NothinFancy/dep/include/glm/ext/vector_common.inl new file mode 100644 index 0000000..e2747be --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_common.inl @@ -0,0 +1,129 @@ +#include "../detail/_vectorize.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec min(vec const& x, vec const& y, vec const& z) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'min' only accept floating-point or integer inputs"); + return glm::min(glm::min(x, y), z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec min(vec const& x, vec const& y, vec const& z, vec const& w) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'min' only accept floating-point or integer inputs"); + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec max(vec const& x, vec const& y, vec const& z) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'max' only accept floating-point or integer inputs"); + return glm::max(glm::max(x, y), z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec max(vec const& x, vec const& y, vec const& z, vec const& w) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'max' only accept floating-point or integer inputs"); + return glm::max(glm::max(x, y), glm::max(z, w)); + } + + template + GLM_FUNC_QUALIFIER vec fmin(vec const& a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point inputs"); + return detail::functor2::call(fmin, a, vec(b)); + } + + template + GLM_FUNC_QUALIFIER vec fmin(vec const& a, vec const& b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point inputs"); + return detail::functor2::call(fmin, a, b); + } + + template + GLM_FUNC_QUALIFIER vec fmin(vec const& a, vec const& b, vec const& c) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point inputs"); + return fmin(fmin(a, b), c); + } + + template + GLM_FUNC_QUALIFIER vec fmin(vec const& a, vec const& b, vec const& c, vec const& d) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point inputs"); + return fmin(fmin(a, b), fmin(c, d)); + } + + template + GLM_FUNC_QUALIFIER vec fmax(vec const& a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point inputs"); + return detail::functor2::call(fmax, a, vec(b)); + } + + template + GLM_FUNC_QUALIFIER vec fmax(vec const& a, vec const& b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point inputs"); + return detail::functor2::call(fmax, a, b); + } + + template + GLM_FUNC_QUALIFIER vec fmax(vec const& a, vec const& b, vec const& c) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point inputs"); + return fmax(fmax(a, b), c); + } + + template + GLM_FUNC_QUALIFIER vec fmax(vec const& a, vec const& b, vec const& c, vec const& d) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point inputs"); + return fmax(fmax(a, b), fmax(c, d)); + } + + template + GLM_FUNC_QUALIFIER vec fclamp(vec const& x, T minVal, T maxVal) + { + return fmin(fmax(x, vec(minVal)), vec(maxVal)); + } + + template + GLM_FUNC_QUALIFIER vec fclamp(vec const& x, vec const& minVal, vec const& maxVal) + { + return fmin(fmax(x, minVal), maxVal); + } + + template + GLM_FUNC_QUALIFIER vec clamp(vec const& Texcoord) + { + return glm::clamp(Texcoord, vec(0), vec(1)); + } + + template + GLM_FUNC_QUALIFIER vec repeat(vec const& Texcoord) + { + return glm::fract(Texcoord); + } + + template + GLM_FUNC_QUALIFIER vec mirrorClamp(vec const& Texcoord) + { + return glm::fract(glm::abs(Texcoord)); + } + + template + GLM_FUNC_QUALIFIER vec mirrorRepeat(vec const& Texcoord) + { + vec const Abs = glm::abs(Texcoord); + vec const Clamp = glm::mod(glm::floor(Abs), vec(2)); + vec const Floor = glm::floor(Abs); + vec const Rest = Abs - Floor; + vec const Mirror = Clamp + Rest; + return mix(Rest, vec(1) - Rest, glm::greaterThanEqual(Mirror, vec(1))); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_double1.hpp b/NothinFancy/dep/include/glm/ext/vector_double1.hpp new file mode 100644 index 0000000..3882667 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_double1.hpp @@ -0,0 +1,31 @@ +/// @ref ext_vector_double1 +/// @file glm/ext/vector_double1.hpp +/// +/// @defgroup ext_vector_double1 GLM_EXT_vector_double1 +/// @ingroup ext +/// +/// Exposes double-precision floating point vector type with one component. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_double1_precision extension. +/// @see ext_vector_float1 extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_double1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_double1 + /// @{ + + /// 1 components vector of double-precision floating-point numbers. + typedef vec<1, double, defaultp> dvec1; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_double1_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_double1_precision.hpp new file mode 100644 index 0000000..1d47195 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_double1_precision.hpp @@ -0,0 +1,36 @@ +/// @ref ext_vector_double1_precision +/// @file glm/ext/vector_double1_precision.hpp +/// +/// @defgroup ext_vector_double1_precision GLM_EXT_vector_double1_precision +/// @ingroup ext +/// +/// Exposes highp_dvec1, mediump_dvec1 and lowp_dvec1 types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_double1 + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_double1_precision extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_double1_precision + /// @{ + + /// 1 component vector of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, double, highp> highp_dvec1; + + /// 1 component vector of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, double, mediump> mediump_dvec1; + + /// 1 component vector of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, double, lowp> lowp_dvec1; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_double2.hpp b/NothinFancy/dep/include/glm/ext/vector_double2.hpp new file mode 100644 index 0000000..60e3577 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_double2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_double2.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 2 components vector of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<2, double, defaultp> dvec2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_double2_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_double2_precision.hpp new file mode 100644 index 0000000..fa53940 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_double2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_double2_precision.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 2 components vector of high double-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, double, highp> highp_dvec2; + + /// 2 components vector of medium double-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, double, mediump> mediump_dvec2; + + /// 2 components vector of low double-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, double, lowp> lowp_dvec2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_double3.hpp b/NothinFancy/dep/include/glm/ext/vector_double3.hpp new file mode 100644 index 0000000..6dfe4c6 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_double3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_double3.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 3 components vector of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<3, double, defaultp> dvec3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_double3_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_double3_precision.hpp new file mode 100644 index 0000000..a8cfa37 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_double3_precision.hpp @@ -0,0 +1,34 @@ +/// @ref core +/// @file glm/ext/vector_double3_precision.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 3 components vector of high double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, double, highp> highp_dvec3; + + /// 3 components vector of medium double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, double, mediump> mediump_dvec3; + + /// 3 components vector of low double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, double, lowp> lowp_dvec3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_double4.hpp b/NothinFancy/dep/include/glm/ext/vector_double4.hpp new file mode 100644 index 0000000..87f225f --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_double4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_double4.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 4 components vector of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<4, double, defaultp> dvec4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_double4_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_double4_precision.hpp new file mode 100644 index 0000000..09cafa1 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_double4_precision.hpp @@ -0,0 +1,35 @@ +/// @ref core +/// @file glm/ext/vector_double4_precision.hpp + +#pragma once +#include "../detail/setup.hpp" +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 4 components vector of high double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, double, highp> highp_dvec4; + + /// 4 components vector of medium double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, double, mediump> mediump_dvec4; + + /// 4 components vector of low double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, double, lowp> lowp_dvec4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_float1.hpp b/NothinFancy/dep/include/glm/ext/vector_float1.hpp new file mode 100644 index 0000000..28acc2c --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_float1.hpp @@ -0,0 +1,31 @@ +/// @ref ext_vector_float1 +/// @file glm/ext/vector_float1.hpp +/// +/// @defgroup ext_vector_float1 GLM_EXT_vector_float1 +/// @ingroup ext +/// +/// Exposes single-precision floating point vector type with one component. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_float1_precision extension. +/// @see ext_vector_double1 extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_float1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_float1 + /// @{ + + /// 1 components vector of single-precision floating-point numbers. + typedef vec<1, float, defaultp> vec1; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_float1_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_float1_precision.hpp new file mode 100644 index 0000000..6e8dad8 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_float1_precision.hpp @@ -0,0 +1,36 @@ +/// @ref ext_vector_float1_precision +/// @file glm/ext/vector_float1_precision.hpp +/// +/// @defgroup ext_vector_float1_precision GLM_EXT_vector_float1_precision +/// @ingroup ext +/// +/// Exposes highp_vec1, mediump_vec1 and lowp_vec1 types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_float1 extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_float1_precision extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_float1_precision + /// @{ + + /// 1 component vector of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, float, highp> highp_vec1; + + /// 1 component vector of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, float, mediump> mediump_vec1; + + /// 1 component vector of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, float, lowp> lowp_vec1; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_float2.hpp b/NothinFancy/dep/include/glm/ext/vector_float2.hpp new file mode 100644 index 0000000..d31545d --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_float2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_float2.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 2 components vector of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<2, float, defaultp> vec2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_float2_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_float2_precision.hpp new file mode 100644 index 0000000..23c0820 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_float2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_float2_precision.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 2 components vector of high single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, float, highp> highp_vec2; + + /// 2 components vector of medium single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, float, mediump> mediump_vec2; + + /// 2 components vector of low single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, float, lowp> lowp_vec2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_float3.hpp b/NothinFancy/dep/include/glm/ext/vector_float3.hpp new file mode 100644 index 0000000..cd79a62 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_float3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_float3.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 3 components vector of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<3, float, defaultp> vec3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_float3_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_float3_precision.hpp new file mode 100644 index 0000000..be640b5 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_float3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_float3_precision.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 3 components vector of high single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, float, highp> highp_vec3; + + /// 3 components vector of medium single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, float, mediump> mediump_vec3; + + /// 3 components vector of low single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, float, lowp> lowp_vec3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_float4.hpp b/NothinFancy/dep/include/glm/ext/vector_float4.hpp new file mode 100644 index 0000000..d84adcc --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_float4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_float4.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 4 components vector of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<4, float, defaultp> vec4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_float4_precision.hpp b/NothinFancy/dep/include/glm/ext/vector_float4_precision.hpp new file mode 100644 index 0000000..aede838 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_float4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_float4_precision.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 4 components vector of high single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, float, highp> highp_vec4; + + /// 4 components vector of medium single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, float, mediump> mediump_vec4; + + /// 4 components vector of low single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, float, lowp> lowp_vec4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_int1.hpp b/NothinFancy/dep/include/glm/ext/vector_int1.hpp new file mode 100644 index 0000000..dc86038 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_int1.hpp @@ -0,0 +1,32 @@ +/// @ref ext_vector_int1 +/// @file glm/ext/vector_int1.hpp +/// +/// @defgroup ext_vector_int1 GLM_EXT_vector_int1 +/// @ingroup ext +/// +/// Exposes ivec1 vector type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_uint1 extension. +/// @see ext_vector_int1_precision extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_int1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_int1 + /// @{ + + /// 1 component vector of signed integer numbers. + typedef vec<1, int, defaultp> ivec1; + + /// @} +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/ext/vector_int1_sized.hpp b/NothinFancy/dep/include/glm/ext/vector_int1_sized.hpp new file mode 100644 index 0000000..de0d4cf --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_int1_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_int1_sized +/// @file glm/ext/vector_int1_sized.hpp +/// +/// @defgroup ext_vector_int1_sized GLM_EXT_vector_int1_sized +/// @ingroup ext +/// +/// Exposes sized signed integer vector types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_int_sized +/// @see ext_vector_uint1_sized + +#pragma once + +#include "../ext/vector_int1.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_int1_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_int1_sized + /// @{ + + /// 8 bit signed integer vector of 1 component type. + /// + /// @see ext_vector_int1_sized + typedef vec<1, int8, defaultp> i8vec1; + + /// 16 bit signed integer vector of 1 component type. + /// + /// @see ext_vector_int1_sized + typedef vec<1, int16, defaultp> i16vec1; + + /// 32 bit signed integer vector of 1 component type. + /// + /// @see ext_vector_int1_sized + typedef vec<1, int32, defaultp> i32vec1; + + /// 64 bit signed integer vector of 1 component type. + /// + /// @see ext_vector_int1_sized + typedef vec<1, int64, defaultp> i64vec1; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_int2.hpp b/NothinFancy/dep/include/glm/ext/vector_int2.hpp new file mode 100644 index 0000000..aef803e --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_int2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_int2.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 2 components vector of signed integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<2, int, defaultp> ivec2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_int2_sized.hpp b/NothinFancy/dep/include/glm/ext/vector_int2_sized.hpp new file mode 100644 index 0000000..1fd57ee --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_int2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_int2_sized +/// @file glm/ext/vector_int2_sized.hpp +/// +/// @defgroup ext_vector_int2_sized GLM_EXT_vector_int2_sized +/// @ingroup ext +/// +/// Exposes sized signed integer vector of 2 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_int_sized +/// @see ext_vector_uint2_sized + +#pragma once + +#include "../ext/vector_int2.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_int2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_int2_sized + /// @{ + + /// 8 bit signed integer vector of 2 components type. + /// + /// @see ext_vector_int2_sized + typedef vec<2, int8, defaultp> i8vec2; + + /// 16 bit signed integer vector of 2 components type. + /// + /// @see ext_vector_int2_sized + typedef vec<2, int16, defaultp> i16vec2; + + /// 32 bit signed integer vector of 2 components type. + /// + /// @see ext_vector_int2_sized + typedef vec<2, int32, defaultp> i32vec2; + + /// 64 bit signed integer vector of 2 components type. + /// + /// @see ext_vector_int2_sized + typedef vec<2, int64, defaultp> i64vec2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_int3.hpp b/NothinFancy/dep/include/glm/ext/vector_int3.hpp new file mode 100644 index 0000000..4767e61 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_int3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_int3.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 3 components vector of signed integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<3, int, defaultp> ivec3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_int3_sized.hpp b/NothinFancy/dep/include/glm/ext/vector_int3_sized.hpp new file mode 100644 index 0000000..085a3fe --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_int3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_int3_sized +/// @file glm/ext/vector_int3_sized.hpp +/// +/// @defgroup ext_vector_int3_sized GLM_EXT_vector_int3_sized +/// @ingroup ext +/// +/// Exposes sized signed integer vector of 3 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_int_sized +/// @see ext_vector_uint3_sized + +#pragma once + +#include "../ext/vector_int3.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_int3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_int3_sized + /// @{ + + /// 8 bit signed integer vector of 3 components type. + /// + /// @see ext_vector_int3_sized + typedef vec<3, int8, defaultp> i8vec3; + + /// 16 bit signed integer vector of 3 components type. + /// + /// @see ext_vector_int3_sized + typedef vec<3, int16, defaultp> i16vec3; + + /// 32 bit signed integer vector of 3 components type. + /// + /// @see ext_vector_int3_sized + typedef vec<3, int32, defaultp> i32vec3; + + /// 64 bit signed integer vector of 3 components type. + /// + /// @see ext_vector_int3_sized + typedef vec<3, int64, defaultp> i64vec3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_int4.hpp b/NothinFancy/dep/include/glm/ext/vector_int4.hpp new file mode 100644 index 0000000..bb23adf --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_int4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_int4.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 4 components vector of signed integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<4, int, defaultp> ivec4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_int4_sized.hpp b/NothinFancy/dep/include/glm/ext/vector_int4_sized.hpp new file mode 100644 index 0000000..c63d465 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_int4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_int4_sized +/// @file glm/ext/vector_int4_sized.hpp +/// +/// @defgroup ext_vector_int4_sized GLM_EXT_vector_int4_sized +/// @ingroup ext +/// +/// Exposes sized signed integer vector of 4 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_int_sized +/// @see ext_vector_uint4_sized + +#pragma once + +#include "../ext/vector_int4.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_int4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_int4_sized + /// @{ + + /// 8 bit signed integer vector of 4 components type. + /// + /// @see ext_vector_int4_sized + typedef vec<4, int8, defaultp> i8vec4; + + /// 16 bit signed integer vector of 4 components type. + /// + /// @see ext_vector_int4_sized + typedef vec<4, int16, defaultp> i16vec4; + + /// 32 bit signed integer vector of 4 components type. + /// + /// @see ext_vector_int4_sized + typedef vec<4, int32, defaultp> i32vec4; + + /// 64 bit signed integer vector of 4 components type. + /// + /// @see ext_vector_int4_sized + typedef vec<4, int64, defaultp> i64vec4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_integer.hpp b/NothinFancy/dep/include/glm/ext/vector_integer.hpp new file mode 100644 index 0000000..1304dd8 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_integer.hpp @@ -0,0 +1,149 @@ +/// @ref ext_vector_integer +/// @file glm/ext/vector_integer.hpp +/// +/// @see core (dependence) +/// @see ext_vector_integer (dependence) +/// +/// @defgroup ext_vector_integer GLM_EXT_vector_integer +/// @ingroup ext +/// +/// Include to use the features of this extension. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_vectorize.hpp" +#include "../vector_relational.hpp" +#include "../common.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_integer extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_integer + /// @{ + + /// Return true if the value is a power of two number. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec isPowerOfTwo(vec const& v); + + /// Return the power of two number which value is just higher the input value, + /// round up to a power of two. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec nextPowerOfTwo(vec const& v); + + /// Return the power of two number which value is just lower the input value, + /// round down to a power of two. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec prevPowerOfTwo(vec const& v); + + /// Return true if the 'Value' is a multiple of 'Multiple'. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec isMultiple(vec const& v, T Multiple); + + /// Return true if the 'Value' is a multiple of 'Multiple'. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec isMultiple(vec const& v, vec const& Multiple); + + /// Higher multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec nextMultiple(vec const& v, T Multiple); + + /// Higher multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec nextMultiple(vec const& v, vec const& Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec prevMultiple(vec const& v, T Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec prevMultiple(vec const& v, vec const& Multiple); + + /// Returns the bit number of the Nth significant bit set to + /// 1 in the binary representation of value. + /// If value bitcount is less than the Nth significant bit, -1 will be returned. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec findNSB(vec const& Source, vec SignificantBitCount); + + /// @} +} //namespace glm + +#include "vector_integer.inl" diff --git a/NothinFancy/dep/include/glm/ext/vector_integer.inl b/NothinFancy/dep/include/glm/ext/vector_integer.inl new file mode 100644 index 0000000..939ff5e --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_integer.inl @@ -0,0 +1,85 @@ +#include "scalar_integer.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec isPowerOfTwo(vec const& Value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'isPowerOfTwo' only accept integer inputs"); + + vec const Result(abs(Value)); + return equal(Result & (Result - vec(1)), vec(0)); + } + + template + GLM_FUNC_QUALIFIER vec nextPowerOfTwo(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'nextPowerOfTwo' only accept integer inputs"); + + return detail::compute_ceilPowerOfTwo::is_signed>::call(v); + } + + template + GLM_FUNC_QUALIFIER vec prevPowerOfTwo(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'prevPowerOfTwo' only accept integer inputs"); + + return detail::functor1::call(prevPowerOfTwo, v); + } + + template + GLM_FUNC_QUALIFIER vec isMultiple(vec const& Value, T Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'isMultiple' only accept integer inputs"); + + return (Value % Multiple) == vec(0); + } + + template + GLM_FUNC_QUALIFIER vec isMultiple(vec const& Value, vec const& Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'isMultiple' only accept integer inputs"); + + return (Value % Multiple) == vec(0); + } + + template + GLM_FUNC_QUALIFIER vec nextMultiple(vec const& Source, T Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'nextMultiple' only accept integer inputs"); + + return detail::functor2::call(nextMultiple, Source, vec(Multiple)); + } + + template + GLM_FUNC_QUALIFIER vec nextMultiple(vec const& Source, vec const& Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'nextMultiple' only accept integer inputs"); + + return detail::functor2::call(nextMultiple, Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER vec prevMultiple(vec const& Source, T Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'prevMultiple' only accept integer inputs"); + + return detail::functor2::call(prevMultiple, Source, vec(Multiple)); + } + + template + GLM_FUNC_QUALIFIER vec prevMultiple(vec const& Source, vec const& Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'prevMultiple' only accept integer inputs"); + + return detail::functor2::call(prevMultiple, Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER vec findNSB(vec const& Source, vec SignificantBitCount) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findNSB' only accept integer inputs"); + + return detail::functor2_vec_int::call(findNSB, Source, SignificantBitCount); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_packing.hpp b/NothinFancy/dep/include/glm/ext/vector_packing.hpp new file mode 100644 index 0000000..76e5d0c --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_packing.hpp @@ -0,0 +1,32 @@ +/// @ref ext_vector_packing +/// @file glm/ext/vector_packing.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_vector_packing GLM_EXT_vector_packing +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// This extension provides a set of function to convert vectors to packed +/// formats. + +#pragma once + +// Dependency: +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_packing extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_packing + /// @{ + + + /// @} +}// namespace glm + +#include "vector_packing.inl" diff --git a/NothinFancy/dep/include/glm/ext/vector_packing.inl b/NothinFancy/dep/include/glm/ext/vector_packing.inl new file mode 100644 index 0000000..e69de29 diff --git a/NothinFancy/dep/include/glm/ext/vector_relational.hpp b/NothinFancy/dep/include/glm/ext/vector_relational.hpp new file mode 100644 index 0000000..1c2367d --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_relational.hpp @@ -0,0 +1,107 @@ +/// @ref ext_vector_relational +/// @file glm/ext/vector_relational.hpp +/// +/// @see core (dependence) +/// @see ext_scalar_integer (dependence) +/// +/// @defgroup ext_vector_relational GLM_EXT_vector_relational +/// @ingroup ext +/// +/// Exposes comparison functions for vector types that take a user defined epsilon values. +/// +/// Include to use the features of this extension. +/// +/// @see core_vector_relational +/// @see ext_scalar_relational +/// @see ext_matrix_relational + +#pragma once + +// Dependencies +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_relational extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_relational + /// @{ + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(vec const& x, vec const& y, T epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(vec const& x, vec const& y, vec const& epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, T epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, vec const& epsilon); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(vec const& x, vec const& y, int ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(vec const& x, vec const& y, vec const& ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is not satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, int ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is not satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, vec const& ULPs); + + /// @} +}//namespace glm + +#include "vector_relational.inl" diff --git a/NothinFancy/dep/include/glm/ext/vector_relational.inl b/NothinFancy/dep/include/glm/ext/vector_relational.inl new file mode 100644 index 0000000..7a39ab5 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_relational.inl @@ -0,0 +1,75 @@ +#include "../vector_relational.hpp" +#include "../common.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/type_float.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, T Epsilon) + { + return equal(x, y, vec(Epsilon)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, vec const& Epsilon) + { + return lessThanEqual(abs(x - y), Epsilon); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, T Epsilon) + { + return notEqual(x, y, vec(Epsilon)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, vec const& Epsilon) + { + return greaterThan(abs(x - y), Epsilon); + } + + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, int MaxULPs) + { + return equal(x, y, vec(MaxULPs)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, vec const& MaxULPs) + { + vec Result(false); + for(length_t i = 0; i < L; ++i) + { + detail::float_t const a(x[i]); + detail::float_t const b(y[i]); + + // Different signs means they do not match. + if(a.negative() != b.negative()) + { + // Check for equality to make sure +0==-0 + Result[i] = a.mantissa() == b.mantissa() && a.exponent() == b.exponent(); + } + else + { + // Find the difference in ULPs. + typename detail::float_t::int_type const DiffULPs = abs(a.i - b.i); + Result[i] = DiffULPs <= MaxULPs[i]; + } + } + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, int MaxULPs) + { + return notEqual(x, y, vec(MaxULPs)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, vec const& MaxULPs) + { + return not_(equal(x, y, MaxULPs)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_uint1.hpp b/NothinFancy/dep/include/glm/ext/vector_uint1.hpp new file mode 100644 index 0000000..eb8a704 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_uint1.hpp @@ -0,0 +1,32 @@ +/// @ref ext_vector_uint1 +/// @file glm/ext/vector_uint1.hpp +/// +/// @defgroup ext_vector_uint1 GLM_EXT_vector_uint1 +/// @ingroup ext +/// +/// Exposes uvec1 vector type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_int1 extension. +/// @see ext_vector_uint1_precision extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_uint1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_uint1 + /// @{ + + /// 1 component vector of unsigned integer numbers. + typedef vec<1, unsigned int, defaultp> uvec1; + + /// @} +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/ext/vector_uint1_sized.hpp b/NothinFancy/dep/include/glm/ext/vector_uint1_sized.hpp new file mode 100644 index 0000000..2a938bb --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_uint1_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_uint1_sized +/// @file glm/ext/vector_uint1_sized.hpp +/// +/// @defgroup ext_vector_uint1_sized GLM_EXT_vector_uint1_sized +/// @ingroup ext +/// +/// Exposes sized unsigned integer vector types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_uint_sized +/// @see ext_vector_int1_sized + +#pragma once + +#include "../ext/vector_uint1.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_uint1_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_uint1_sized + /// @{ + + /// 8 bit unsigned integer vector of 1 component type. + /// + /// @see ext_vector_uint1_sized + typedef vec<1, uint8, defaultp> u8vec1; + + /// 16 bit unsigned integer vector of 1 component type. + /// + /// @see ext_vector_uint1_sized + typedef vec<1, uint16, defaultp> u16vec1; + + /// 32 bit unsigned integer vector of 1 component type. + /// + /// @see ext_vector_uint1_sized + typedef vec<1, uint32, defaultp> u32vec1; + + /// 64 bit unsigned integer vector of 1 component type. + /// + /// @see ext_vector_uint1_sized + typedef vec<1, uint64, defaultp> u64vec1; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_uint2.hpp b/NothinFancy/dep/include/glm/ext/vector_uint2.hpp new file mode 100644 index 0000000..03c00f5 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_uint2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_uint2.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 2 components vector of unsigned integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<2, unsigned int, defaultp> uvec2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_uint2_sized.hpp b/NothinFancy/dep/include/glm/ext/vector_uint2_sized.hpp new file mode 100644 index 0000000..620fdc6 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_uint2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_uint2_sized +/// @file glm/ext/vector_uint2_sized.hpp +/// +/// @defgroup ext_vector_uint2_sized GLM_EXT_vector_uint2_sized +/// @ingroup ext +/// +/// Exposes sized unsigned integer vector of 2 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_uint_sized +/// @see ext_vector_int2_sized + +#pragma once + +#include "../ext/vector_uint2.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_uint2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_uint2_sized + /// @{ + + /// 8 bit unsigned integer vector of 2 components type. + /// + /// @see ext_vector_uint2_sized + typedef vec<2, uint8, defaultp> u8vec2; + + /// 16 bit unsigned integer vector of 2 components type. + /// + /// @see ext_vector_uint2_sized + typedef vec<2, uint16, defaultp> u16vec2; + + /// 32 bit unsigned integer vector of 2 components type. + /// + /// @see ext_vector_uint2_sized + typedef vec<2, uint32, defaultp> u32vec2; + + /// 64 bit unsigned integer vector of 2 components type. + /// + /// @see ext_vector_uint2_sized + typedef vec<2, uint64, defaultp> u64vec2; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_uint3.hpp b/NothinFancy/dep/include/glm/ext/vector_uint3.hpp new file mode 100644 index 0000000..f5b41c4 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_uint3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_uint3.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 3 components vector of unsigned integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<3, unsigned int, defaultp> uvec3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_uint3_sized.hpp b/NothinFancy/dep/include/glm/ext/vector_uint3_sized.hpp new file mode 100644 index 0000000..6f96b98 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_uint3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_uint3_sized +/// @file glm/ext/vector_uint3_sized.hpp +/// +/// @defgroup ext_vector_uint3_sized GLM_EXT_vector_uint3_sized +/// @ingroup ext +/// +/// Exposes sized unsigned integer vector of 3 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_uint_sized +/// @see ext_vector_int3_sized + +#pragma once + +#include "../ext/vector_uint3.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_uint3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_uint3_sized + /// @{ + + /// 8 bit unsigned integer vector of 3 components type. + /// + /// @see ext_vector_uint3_sized + typedef vec<3, uint8, defaultp> u8vec3; + + /// 16 bit unsigned integer vector of 3 components type. + /// + /// @see ext_vector_uint3_sized + typedef vec<3, uint16, defaultp> u16vec3; + + /// 32 bit unsigned integer vector of 3 components type. + /// + /// @see ext_vector_uint3_sized + typedef vec<3, uint32, defaultp> u32vec3; + + /// 64 bit unsigned integer vector of 3 components type. + /// + /// @see ext_vector_uint3_sized + typedef vec<3, uint64, defaultp> u64vec3; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_uint4.hpp b/NothinFancy/dep/include/glm/ext/vector_uint4.hpp new file mode 100644 index 0000000..32ced58 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_uint4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_uint4.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 4 components vector of unsigned integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<4, unsigned int, defaultp> uvec4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_uint4_sized.hpp b/NothinFancy/dep/include/glm/ext/vector_uint4_sized.hpp new file mode 100644 index 0000000..da992ea --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_uint4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_uint4_sized +/// @file glm/ext/vector_uint4_sized.hpp +/// +/// @defgroup ext_vector_uint4_sized GLM_EXT_vector_uint4_sized +/// @ingroup ext +/// +/// Exposes sized unsigned integer vector of 4 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_uint_sized +/// @see ext_vector_int4_sized + +#pragma once + +#include "../ext/vector_uint4.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_uint4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_uint4_sized + /// @{ + + /// 8 bit unsigned integer vector of 4 components type. + /// + /// @see ext_vector_uint4_sized + typedef vec<4, uint8, defaultp> u8vec4; + + /// 16 bit unsigned integer vector of 4 components type. + /// + /// @see ext_vector_uint4_sized + typedef vec<4, uint16, defaultp> u16vec4; + + /// 32 bit unsigned integer vector of 4 components type. + /// + /// @see ext_vector_uint4_sized + typedef vec<4, uint32, defaultp> u32vec4; + + /// 64 bit unsigned integer vector of 4 components type. + /// + /// @see ext_vector_uint4_sized + typedef vec<4, uint64, defaultp> u64vec4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/ext/vector_ulp.hpp b/NothinFancy/dep/include/glm/ext/vector_ulp.hpp new file mode 100644 index 0000000..6210396 --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_ulp.hpp @@ -0,0 +1,109 @@ +/// @ref ext_vector_ulp +/// @file glm/ext/vector_ulp.hpp +/// +/// @defgroup ext_vector_ulp GLM_EXT_vector_ulp +/// @ingroup ext +/// +/// Allow the measurement of the accuracy of a function against a reference +/// implementation. This extension works on floating-point data and provide results +/// in ULP. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_ulp +/// @see ext_scalar_relational +/// @see ext_vector_relational + +#pragma once + +// Dependencies +#include "../ext/scalar_ulp.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_ulp extension included") +#endif + +namespace glm +{ + /// Return the next ULP value(s) after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec nextFloat(vec const& x); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec nextFloat(vec const& x, int ULPs); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec nextFloat(vec const& x, vec const& ULPs); + + /// Return the previous ULP value(s) before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec prevFloat(vec const& x); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec prevFloat(vec const& x, int ULPs); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec prevFloat(vec const& x, vec const& ULPs); + + /// Return the distance in the number of ULP between 2 single-precision floating-point scalars. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec floatDistance(vec const& x, vec const& y); + + /// Return the distance in the number of ULP between 2 double-precision floating-point scalars. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec floatDistance(vec const& x, vec const& y); + + /// @} +}//namespace glm + +#include "vector_ulp.inl" diff --git a/NothinFancy/dep/include/glm/ext/vector_ulp.inl b/NothinFancy/dep/include/glm/ext/vector_ulp.inl new file mode 100644 index 0000000..91565ce --- /dev/null +++ b/NothinFancy/dep/include/glm/ext/vector_ulp.inl @@ -0,0 +1,74 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec nextFloat(vec const& x) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = nextFloat(x[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec nextFloat(vec const& x, int ULPs) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = nextFloat(x[i], ULPs); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec nextFloat(vec const& x, vec const& ULPs) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = nextFloat(x[i], ULPs[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prevFloat(vec const& x) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prevFloat(x[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prevFloat(vec const& x, int ULPs) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prevFloat(x[i], ULPs); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prevFloat(vec const& x, vec const& ULPs) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prevFloat(x[i], ULPs[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec floatDistance(vec const& x, vec const& y) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = floatDistance(x[i], y[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec floatDistance(vec const& x, vec const& y) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = floatDistance(x[i], y[i]); + return Result; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/fwd.hpp b/NothinFancy/dep/include/glm/fwd.hpp new file mode 100644 index 0000000..89177f4 --- /dev/null +++ b/NothinFancy/dep/include/glm/fwd.hpp @@ -0,0 +1,1233 @@ +#pragma once + +#include "detail/qualifier.hpp" + +namespace glm +{ +#if GLM_HAS_EXTENDED_INTEGER_TYPE + typedef std::int8_t int8; + typedef std::int16_t int16; + typedef std::int32_t int32; + typedef std::int64_t int64; + + typedef std::uint8_t uint8; + typedef std::uint16_t uint16; + typedef std::uint32_t uint32; + typedef std::uint64_t uint64; +#else + typedef signed char int8; + typedef signed short int16; + typedef signed int int32; + typedef detail::int64 int64; + + typedef unsigned char uint8; + typedef unsigned short uint16; + typedef unsigned int uint32; + typedef detail::uint64 uint64; +#endif + + // Scalar int + + typedef int8 lowp_i8; + typedef int8 mediump_i8; + typedef int8 highp_i8; + typedef int8 i8; + + typedef int8 lowp_int8; + typedef int8 mediump_int8; + typedef int8 highp_int8; + + typedef int8 lowp_int8_t; + typedef int8 mediump_int8_t; + typedef int8 highp_int8_t; + typedef int8 int8_t; + + typedef int16 lowp_i16; + typedef int16 mediump_i16; + typedef int16 highp_i16; + typedef int16 i16; + + typedef int16 lowp_int16; + typedef int16 mediump_int16; + typedef int16 highp_int16; + + typedef int16 lowp_int16_t; + typedef int16 mediump_int16_t; + typedef int16 highp_int16_t; + typedef int16 int16_t; + + typedef int32 lowp_i32; + typedef int32 mediump_i32; + typedef int32 highp_i32; + typedef int32 i32; + + typedef int32 lowp_int32; + typedef int32 mediump_int32; + typedef int32 highp_int32; + + typedef int32 lowp_int32_t; + typedef int32 mediump_int32_t; + typedef int32 highp_int32_t; + typedef int32 int32_t; + + typedef int64 lowp_i64; + typedef int64 mediump_i64; + typedef int64 highp_i64; + typedef int64 i64; + + typedef int64 lowp_int64; + typedef int64 mediump_int64; + typedef int64 highp_int64; + + typedef int64 lowp_int64_t; + typedef int64 mediump_int64_t; + typedef int64 highp_int64_t; + typedef int64 int64_t; + + // Scalar uint + + typedef unsigned int uint; + + typedef uint8 lowp_u8; + typedef uint8 mediump_u8; + typedef uint8 highp_u8; + typedef uint8 u8; + + typedef uint8 lowp_uint8; + typedef uint8 mediump_uint8; + typedef uint8 highp_uint8; + + typedef uint8 lowp_uint8_t; + typedef uint8 mediump_uint8_t; + typedef uint8 highp_uint8_t; + typedef uint8 uint8_t; + + typedef uint16 lowp_u16; + typedef uint16 mediump_u16; + typedef uint16 highp_u16; + typedef uint16 u16; + + typedef uint16 lowp_uint16; + typedef uint16 mediump_uint16; + typedef uint16 highp_uint16; + + typedef uint16 lowp_uint16_t; + typedef uint16 mediump_uint16_t; + typedef uint16 highp_uint16_t; + typedef uint16 uint16_t; + + typedef uint32 lowp_u32; + typedef uint32 mediump_u32; + typedef uint32 highp_u32; + typedef uint32 u32; + + typedef uint32 lowp_uint32; + typedef uint32 mediump_uint32; + typedef uint32 highp_uint32; + + typedef uint32 lowp_uint32_t; + typedef uint32 mediump_uint32_t; + typedef uint32 highp_uint32_t; + typedef uint32 uint32_t; + + typedef uint64 lowp_u64; + typedef uint64 mediump_u64; + typedef uint64 highp_u64; + typedef uint64 u64; + + typedef uint64 lowp_uint64; + typedef uint64 mediump_uint64; + typedef uint64 highp_uint64; + + typedef uint64 lowp_uint64_t; + typedef uint64 mediump_uint64_t; + typedef uint64 highp_uint64_t; + typedef uint64 uint64_t; + + // Scalar float + + typedef float lowp_f32; + typedef float mediump_f32; + typedef float highp_f32; + typedef float f32; + + typedef float lowp_float32; + typedef float mediump_float32; + typedef float highp_float32; + typedef float float32; + + typedef float lowp_float32_t; + typedef float mediump_float32_t; + typedef float highp_float32_t; + typedef float float32_t; + + + typedef double lowp_f64; + typedef double mediump_f64; + typedef double highp_f64; + typedef double f64; + + typedef double lowp_float64; + typedef double mediump_float64; + typedef double highp_float64; + typedef double float64; + + typedef double lowp_float64_t; + typedef double mediump_float64_t; + typedef double highp_float64_t; + typedef double float64_t; + + // Vector bool + + typedef vec<1, bool, lowp> lowp_bvec1; + typedef vec<2, bool, lowp> lowp_bvec2; + typedef vec<3, bool, lowp> lowp_bvec3; + typedef vec<4, bool, lowp> lowp_bvec4; + + typedef vec<1, bool, mediump> mediump_bvec1; + typedef vec<2, bool, mediump> mediump_bvec2; + typedef vec<3, bool, mediump> mediump_bvec3; + typedef vec<4, bool, mediump> mediump_bvec4; + + typedef vec<1, bool, highp> highp_bvec1; + typedef vec<2, bool, highp> highp_bvec2; + typedef vec<3, bool, highp> highp_bvec3; + typedef vec<4, bool, highp> highp_bvec4; + + typedef vec<1, bool, defaultp> bvec1; + typedef vec<2, bool, defaultp> bvec2; + typedef vec<3, bool, defaultp> bvec3; + typedef vec<4, bool, defaultp> bvec4; + + // Vector int + + typedef vec<1, int, lowp> lowp_ivec1; + typedef vec<2, int, lowp> lowp_ivec2; + typedef vec<3, int, lowp> lowp_ivec3; + typedef vec<4, int, lowp> lowp_ivec4; + + typedef vec<1, int, mediump> mediump_ivec1; + typedef vec<2, int, mediump> mediump_ivec2; + typedef vec<3, int, mediump> mediump_ivec3; + typedef vec<4, int, mediump> mediump_ivec4; + + typedef vec<1, int, highp> highp_ivec1; + typedef vec<2, int, highp> highp_ivec2; + typedef vec<3, int, highp> highp_ivec3; + typedef vec<4, int, highp> highp_ivec4; + + typedef vec<1, int, defaultp> ivec1; + typedef vec<2, int, defaultp> ivec2; + typedef vec<3, int, defaultp> ivec3; + typedef vec<4, int, defaultp> ivec4; + + typedef vec<1, i8, lowp> lowp_i8vec1; + typedef vec<2, i8, lowp> lowp_i8vec2; + typedef vec<3, i8, lowp> lowp_i8vec3; + typedef vec<4, i8, lowp> lowp_i8vec4; + + typedef vec<1, i8, mediump> mediump_i8vec1; + typedef vec<2, i8, mediump> mediump_i8vec2; + typedef vec<3, i8, mediump> mediump_i8vec3; + typedef vec<4, i8, mediump> mediump_i8vec4; + + typedef vec<1, i8, highp> highp_i8vec1; + typedef vec<2, i8, highp> highp_i8vec2; + typedef vec<3, i8, highp> highp_i8vec3; + typedef vec<4, i8, highp> highp_i8vec4; + + typedef vec<1, i8, defaultp> i8vec1; + typedef vec<2, i8, defaultp> i8vec2; + typedef vec<3, i8, defaultp> i8vec3; + typedef vec<4, i8, defaultp> i8vec4; + + typedef vec<1, i16, lowp> lowp_i16vec1; + typedef vec<2, i16, lowp> lowp_i16vec2; + typedef vec<3, i16, lowp> lowp_i16vec3; + typedef vec<4, i16, lowp> lowp_i16vec4; + + typedef vec<1, i16, mediump> mediump_i16vec1; + typedef vec<2, i16, mediump> mediump_i16vec2; + typedef vec<3, i16, mediump> mediump_i16vec3; + typedef vec<4, i16, mediump> mediump_i16vec4; + + typedef vec<1, i16, highp> highp_i16vec1; + typedef vec<2, i16, highp> highp_i16vec2; + typedef vec<3, i16, highp> highp_i16vec3; + typedef vec<4, i16, highp> highp_i16vec4; + + typedef vec<1, i16, defaultp> i16vec1; + typedef vec<2, i16, defaultp> i16vec2; + typedef vec<3, i16, defaultp> i16vec3; + typedef vec<4, i16, defaultp> i16vec4; + + typedef vec<1, i32, lowp> lowp_i32vec1; + typedef vec<2, i32, lowp> lowp_i32vec2; + typedef vec<3, i32, lowp> lowp_i32vec3; + typedef vec<4, i32, lowp> lowp_i32vec4; + + typedef vec<1, i32, mediump> mediump_i32vec1; + typedef vec<2, i32, mediump> mediump_i32vec2; + typedef vec<3, i32, mediump> mediump_i32vec3; + typedef vec<4, i32, mediump> mediump_i32vec4; + + typedef vec<1, i32, highp> highp_i32vec1; + typedef vec<2, i32, highp> highp_i32vec2; + typedef vec<3, i32, highp> highp_i32vec3; + typedef vec<4, i32, highp> highp_i32vec4; + + typedef vec<1, i32, defaultp> i32vec1; + typedef vec<2, i32, defaultp> i32vec2; + typedef vec<3, i32, defaultp> i32vec3; + typedef vec<4, i32, defaultp> i32vec4; + + typedef vec<1, i64, lowp> lowp_i64vec1; + typedef vec<2, i64, lowp> lowp_i64vec2; + typedef vec<3, i64, lowp> lowp_i64vec3; + typedef vec<4, i64, lowp> lowp_i64vec4; + + typedef vec<1, i64, mediump> mediump_i64vec1; + typedef vec<2, i64, mediump> mediump_i64vec2; + typedef vec<3, i64, mediump> mediump_i64vec3; + typedef vec<4, i64, mediump> mediump_i64vec4; + + typedef vec<1, i64, highp> highp_i64vec1; + typedef vec<2, i64, highp> highp_i64vec2; + typedef vec<3, i64, highp> highp_i64vec3; + typedef vec<4, i64, highp> highp_i64vec4; + + typedef vec<1, i64, defaultp> i64vec1; + typedef vec<2, i64, defaultp> i64vec2; + typedef vec<3, i64, defaultp> i64vec3; + typedef vec<4, i64, defaultp> i64vec4; + + // Vector uint + + typedef vec<1, uint, lowp> lowp_uvec1; + typedef vec<2, uint, lowp> lowp_uvec2; + typedef vec<3, uint, lowp> lowp_uvec3; + typedef vec<4, uint, lowp> lowp_uvec4; + + typedef vec<1, uint, mediump> mediump_uvec1; + typedef vec<2, uint, mediump> mediump_uvec2; + typedef vec<3, uint, mediump> mediump_uvec3; + typedef vec<4, uint, mediump> mediump_uvec4; + + typedef vec<1, uint, highp> highp_uvec1; + typedef vec<2, uint, highp> highp_uvec2; + typedef vec<3, uint, highp> highp_uvec3; + typedef vec<4, uint, highp> highp_uvec4; + + typedef vec<1, uint, defaultp> uvec1; + typedef vec<2, uint, defaultp> uvec2; + typedef vec<3, uint, defaultp> uvec3; + typedef vec<4, uint, defaultp> uvec4; + + typedef vec<1, u8, lowp> lowp_u8vec1; + typedef vec<2, u8, lowp> lowp_u8vec2; + typedef vec<3, u8, lowp> lowp_u8vec3; + typedef vec<4, u8, lowp> lowp_u8vec4; + + typedef vec<1, u8, mediump> mediump_u8vec1; + typedef vec<2, u8, mediump> mediump_u8vec2; + typedef vec<3, u8, mediump> mediump_u8vec3; + typedef vec<4, u8, mediump> mediump_u8vec4; + + typedef vec<1, u8, highp> highp_u8vec1; + typedef vec<2, u8, highp> highp_u8vec2; + typedef vec<3, u8, highp> highp_u8vec3; + typedef vec<4, u8, highp> highp_u8vec4; + + typedef vec<1, u8, defaultp> u8vec1; + typedef vec<2, u8, defaultp> u8vec2; + typedef vec<3, u8, defaultp> u8vec3; + typedef vec<4, u8, defaultp> u8vec4; + + typedef vec<1, u16, lowp> lowp_u16vec1; + typedef vec<2, u16, lowp> lowp_u16vec2; + typedef vec<3, u16, lowp> lowp_u16vec3; + typedef vec<4, u16, lowp> lowp_u16vec4; + + typedef vec<1, u16, mediump> mediump_u16vec1; + typedef vec<2, u16, mediump> mediump_u16vec2; + typedef vec<3, u16, mediump> mediump_u16vec3; + typedef vec<4, u16, mediump> mediump_u16vec4; + + typedef vec<1, u16, highp> highp_u16vec1; + typedef vec<2, u16, highp> highp_u16vec2; + typedef vec<3, u16, highp> highp_u16vec3; + typedef vec<4, u16, highp> highp_u16vec4; + + typedef vec<1, u16, defaultp> u16vec1; + typedef vec<2, u16, defaultp> u16vec2; + typedef vec<3, u16, defaultp> u16vec3; + typedef vec<4, u16, defaultp> u16vec4; + + typedef vec<1, u32, lowp> lowp_u32vec1; + typedef vec<2, u32, lowp> lowp_u32vec2; + typedef vec<3, u32, lowp> lowp_u32vec3; + typedef vec<4, u32, lowp> lowp_u32vec4; + + typedef vec<1, u32, mediump> mediump_u32vec1; + typedef vec<2, u32, mediump> mediump_u32vec2; + typedef vec<3, u32, mediump> mediump_u32vec3; + typedef vec<4, u32, mediump> mediump_u32vec4; + + typedef vec<1, u32, highp> highp_u32vec1; + typedef vec<2, u32, highp> highp_u32vec2; + typedef vec<3, u32, highp> highp_u32vec3; + typedef vec<4, u32, highp> highp_u32vec4; + + typedef vec<1, u32, defaultp> u32vec1; + typedef vec<2, u32, defaultp> u32vec2; + typedef vec<3, u32, defaultp> u32vec3; + typedef vec<4, u32, defaultp> u32vec4; + + typedef vec<1, u64, lowp> lowp_u64vec1; + typedef vec<2, u64, lowp> lowp_u64vec2; + typedef vec<3, u64, lowp> lowp_u64vec3; + typedef vec<4, u64, lowp> lowp_u64vec4; + + typedef vec<1, u64, mediump> mediump_u64vec1; + typedef vec<2, u64, mediump> mediump_u64vec2; + typedef vec<3, u64, mediump> mediump_u64vec3; + typedef vec<4, u64, mediump> mediump_u64vec4; + + typedef vec<1, u64, highp> highp_u64vec1; + typedef vec<2, u64, highp> highp_u64vec2; + typedef vec<3, u64, highp> highp_u64vec3; + typedef vec<4, u64, highp> highp_u64vec4; + + typedef vec<1, u64, defaultp> u64vec1; + typedef vec<2, u64, defaultp> u64vec2; + typedef vec<3, u64, defaultp> u64vec3; + typedef vec<4, u64, defaultp> u64vec4; + + // Vector float + + typedef vec<1, float, lowp> lowp_vec1; + typedef vec<2, float, lowp> lowp_vec2; + typedef vec<3, float, lowp> lowp_vec3; + typedef vec<4, float, lowp> lowp_vec4; + + typedef vec<1, float, mediump> mediump_vec1; + typedef vec<2, float, mediump> mediump_vec2; + typedef vec<3, float, mediump> mediump_vec3; + typedef vec<4, float, mediump> mediump_vec4; + + typedef vec<1, float, highp> highp_vec1; + typedef vec<2, float, highp> highp_vec2; + typedef vec<3, float, highp> highp_vec3; + typedef vec<4, float, highp> highp_vec4; + + typedef vec<1, float, defaultp> vec1; + typedef vec<2, float, defaultp> vec2; + typedef vec<3, float, defaultp> vec3; + typedef vec<4, float, defaultp> vec4; + + typedef vec<1, float, lowp> lowp_fvec1; + typedef vec<2, float, lowp> lowp_fvec2; + typedef vec<3, float, lowp> lowp_fvec3; + typedef vec<4, float, lowp> lowp_fvec4; + + typedef vec<1, float, mediump> mediump_fvec1; + typedef vec<2, float, mediump> mediump_fvec2; + typedef vec<3, float, mediump> mediump_fvec3; + typedef vec<4, float, mediump> mediump_fvec4; + + typedef vec<1, float, highp> highp_fvec1; + typedef vec<2, float, highp> highp_fvec2; + typedef vec<3, float, highp> highp_fvec3; + typedef vec<4, float, highp> highp_fvec4; + + typedef vec<1, f32, defaultp> fvec1; + typedef vec<2, f32, defaultp> fvec2; + typedef vec<3, f32, defaultp> fvec3; + typedef vec<4, f32, defaultp> fvec4; + + typedef vec<1, f32, lowp> lowp_f32vec1; + typedef vec<2, f32, lowp> lowp_f32vec2; + typedef vec<3, f32, lowp> lowp_f32vec3; + typedef vec<4, f32, lowp> lowp_f32vec4; + + typedef vec<1, f32, mediump> mediump_f32vec1; + typedef vec<2, f32, mediump> mediump_f32vec2; + typedef vec<3, f32, mediump> mediump_f32vec3; + typedef vec<4, f32, mediump> mediump_f32vec4; + + typedef vec<1, f32, highp> highp_f32vec1; + typedef vec<2, f32, highp> highp_f32vec2; + typedef vec<3, f32, highp> highp_f32vec3; + typedef vec<4, f32, highp> highp_f32vec4; + + typedef vec<1, f32, defaultp> f32vec1; + typedef vec<2, f32, defaultp> f32vec2; + typedef vec<3, f32, defaultp> f32vec3; + typedef vec<4, f32, defaultp> f32vec4; + + typedef vec<1, f64, lowp> lowp_dvec1; + typedef vec<2, f64, lowp> lowp_dvec2; + typedef vec<3, f64, lowp> lowp_dvec3; + typedef vec<4, f64, lowp> lowp_dvec4; + + typedef vec<1, f64, mediump> mediump_dvec1; + typedef vec<2, f64, mediump> mediump_dvec2; + typedef vec<3, f64, mediump> mediump_dvec3; + typedef vec<4, f64, mediump> mediump_dvec4; + + typedef vec<1, f64, highp> highp_dvec1; + typedef vec<2, f64, highp> highp_dvec2; + typedef vec<3, f64, highp> highp_dvec3; + typedef vec<4, f64, highp> highp_dvec4; + + typedef vec<1, f64, defaultp> dvec1; + typedef vec<2, f64, defaultp> dvec2; + typedef vec<3, f64, defaultp> dvec3; + typedef vec<4, f64, defaultp> dvec4; + + typedef vec<1, f64, lowp> lowp_f64vec1; + typedef vec<2, f64, lowp> lowp_f64vec2; + typedef vec<3, f64, lowp> lowp_f64vec3; + typedef vec<4, f64, lowp> lowp_f64vec4; + + typedef vec<1, f64, mediump> mediump_f64vec1; + typedef vec<2, f64, mediump> mediump_f64vec2; + typedef vec<3, f64, mediump> mediump_f64vec3; + typedef vec<4, f64, mediump> mediump_f64vec4; + + typedef vec<1, f64, highp> highp_f64vec1; + typedef vec<2, f64, highp> highp_f64vec2; + typedef vec<3, f64, highp> highp_f64vec3; + typedef vec<4, f64, highp> highp_f64vec4; + + typedef vec<1, f64, defaultp> f64vec1; + typedef vec<2, f64, defaultp> f64vec2; + typedef vec<3, f64, defaultp> f64vec3; + typedef vec<4, f64, defaultp> f64vec4; + + // Matrix NxN + + typedef mat<2, 2, f32, lowp> lowp_mat2; + typedef mat<3, 3, f32, lowp> lowp_mat3; + typedef mat<4, 4, f32, lowp> lowp_mat4; + + typedef mat<2, 2, f32, mediump> mediump_mat2; + typedef mat<3, 3, f32, mediump> mediump_mat3; + typedef mat<4, 4, f32, mediump> mediump_mat4; + + typedef mat<2, 2, f32, highp> highp_mat2; + typedef mat<3, 3, f32, highp> highp_mat3; + typedef mat<4, 4, f32, highp> highp_mat4; + + typedef mat<2, 2, f32, defaultp> mat2; + typedef mat<3, 3, f32, defaultp> mat3; + typedef mat<4, 4, f32, defaultp> mat4; + + typedef mat<2, 2, f32, lowp> lowp_fmat2; + typedef mat<3, 3, f32, lowp> lowp_fmat3; + typedef mat<4, 4, f32, lowp> lowp_fmat4; + + typedef mat<2, 2, f32, mediump> mediump_fmat2; + typedef mat<3, 3, f32, mediump> mediump_fmat3; + typedef mat<4, 4, f32, mediump> mediump_fmat4; + + typedef mat<2, 2, f32, highp> highp_fmat2; + typedef mat<3, 3, f32, highp> highp_fmat3; + typedef mat<4, 4, f32, highp> highp_fmat4; + + typedef mat<2, 2, f32, defaultp> fmat2; + typedef mat<3, 3, f32, defaultp> fmat3; + typedef mat<4, 4, f32, defaultp> fmat4; + + typedef mat<2, 2, f32, lowp> lowp_f32mat2; + typedef mat<3, 3, f32, lowp> lowp_f32mat3; + typedef mat<4, 4, f32, lowp> lowp_f32mat4; + + typedef mat<2, 2, f32, mediump> mediump_f32mat2; + typedef mat<3, 3, f32, mediump> mediump_f32mat3; + typedef mat<4, 4, f32, mediump> mediump_f32mat4; + + typedef mat<2, 2, f32, highp> highp_f32mat2; + typedef mat<3, 3, f32, highp> highp_f32mat3; + typedef mat<4, 4, f32, highp> highp_f32mat4; + + typedef mat<2, 2, f32, defaultp> f32mat2; + typedef mat<3, 3, f32, defaultp> f32mat3; + typedef mat<4, 4, f32, defaultp> f32mat4; + + typedef mat<2, 2, f64, lowp> lowp_dmat2; + typedef mat<3, 3, f64, lowp> lowp_dmat3; + typedef mat<4, 4, f64, lowp> lowp_dmat4; + + typedef mat<2, 2, f64, mediump> mediump_dmat2; + typedef mat<3, 3, f64, mediump> mediump_dmat3; + typedef mat<4, 4, f64, mediump> mediump_dmat4; + + typedef mat<2, 2, f64, highp> highp_dmat2; + typedef mat<3, 3, f64, highp> highp_dmat3; + typedef mat<4, 4, f64, highp> highp_dmat4; + + typedef mat<2, 2, f64, defaultp> dmat2; + typedef mat<3, 3, f64, defaultp> dmat3; + typedef mat<4, 4, f64, defaultp> dmat4; + + typedef mat<2, 2, f64, lowp> lowp_f64mat2; + typedef mat<3, 3, f64, lowp> lowp_f64mat3; + typedef mat<4, 4, f64, lowp> lowp_f64mat4; + + typedef mat<2, 2, f64, mediump> mediump_f64mat2; + typedef mat<3, 3, f64, mediump> mediump_f64mat3; + typedef mat<4, 4, f64, mediump> mediump_f64mat4; + + typedef mat<2, 2, f64, highp> highp_f64mat2; + typedef mat<3, 3, f64, highp> highp_f64mat3; + typedef mat<4, 4, f64, highp> highp_f64mat4; + + typedef mat<2, 2, f64, defaultp> f64mat2; + typedef mat<3, 3, f64, defaultp> f64mat3; + typedef mat<4, 4, f64, defaultp> f64mat4; + + // Matrix MxN + + typedef mat<2, 2, f32, lowp> lowp_mat2x2; + typedef mat<2, 3, f32, lowp> lowp_mat2x3; + typedef mat<2, 4, f32, lowp> lowp_mat2x4; + typedef mat<3, 2, f32, lowp> lowp_mat3x2; + typedef mat<3, 3, f32, lowp> lowp_mat3x3; + typedef mat<3, 4, f32, lowp> lowp_mat3x4; + typedef mat<4, 2, f32, lowp> lowp_mat4x2; + typedef mat<4, 3, f32, lowp> lowp_mat4x3; + typedef mat<4, 4, f32, lowp> lowp_mat4x4; + + typedef mat<2, 2, f32, mediump> mediump_mat2x2; + typedef mat<2, 3, f32, mediump> mediump_mat2x3; + typedef mat<2, 4, f32, mediump> mediump_mat2x4; + typedef mat<3, 2, f32, mediump> mediump_mat3x2; + typedef mat<3, 3, f32, mediump> mediump_mat3x3; + typedef mat<3, 4, f32, mediump> mediump_mat3x4; + typedef mat<4, 2, f32, mediump> mediump_mat4x2; + typedef mat<4, 3, f32, mediump> mediump_mat4x3; + typedef mat<4, 4, f32, mediump> mediump_mat4x4; + + typedef mat<2, 2, f32, highp> highp_mat2x2; + typedef mat<2, 3, f32, highp> highp_mat2x3; + typedef mat<2, 4, f32, highp> highp_mat2x4; + typedef mat<3, 2, f32, highp> highp_mat3x2; + typedef mat<3, 3, f32, highp> highp_mat3x3; + typedef mat<3, 4, f32, highp> highp_mat3x4; + typedef mat<4, 2, f32, highp> highp_mat4x2; + typedef mat<4, 3, f32, highp> highp_mat4x3; + typedef mat<4, 4, f32, highp> highp_mat4x4; + + typedef mat<2, 2, f32, defaultp> mat2x2; + typedef mat<3, 2, f32, defaultp> mat3x2; + typedef mat<4, 2, f32, defaultp> mat4x2; + typedef mat<2, 3, f32, defaultp> mat2x3; + typedef mat<3, 3, f32, defaultp> mat3x3; + typedef mat<4, 3, f32, defaultp> mat4x3; + typedef mat<2, 4, f32, defaultp> mat2x4; + typedef mat<3, 4, f32, defaultp> mat3x4; + typedef mat<4, 4, f32, defaultp> mat4x4; + + typedef mat<2, 2, f32, lowp> lowp_fmat2x2; + typedef mat<2, 3, f32, lowp> lowp_fmat2x3; + typedef mat<2, 4, f32, lowp> lowp_fmat2x4; + typedef mat<3, 2, f32, lowp> lowp_fmat3x2; + typedef mat<3, 3, f32, lowp> lowp_fmat3x3; + typedef mat<3, 4, f32, lowp> lowp_fmat3x4; + typedef mat<4, 2, f32, lowp> lowp_fmat4x2; + typedef mat<4, 3, f32, lowp> lowp_fmat4x3; + typedef mat<4, 4, f32, lowp> lowp_fmat4x4; + + typedef mat<2, 2, f32, mediump> mediump_fmat2x2; + typedef mat<2, 3, f32, mediump> mediump_fmat2x3; + typedef mat<2, 4, f32, mediump> mediump_fmat2x4; + typedef mat<3, 2, f32, mediump> mediump_fmat3x2; + typedef mat<3, 3, f32, mediump> mediump_fmat3x3; + typedef mat<3, 4, f32, mediump> mediump_fmat3x4; + typedef mat<4, 2, f32, mediump> mediump_fmat4x2; + typedef mat<4, 3, f32, mediump> mediump_fmat4x3; + typedef mat<4, 4, f32, mediump> mediump_fmat4x4; + + typedef mat<2, 2, f32, highp> highp_fmat2x2; + typedef mat<2, 3, f32, highp> highp_fmat2x3; + typedef mat<2, 4, f32, highp> highp_fmat2x4; + typedef mat<3, 2, f32, highp> highp_fmat3x2; + typedef mat<3, 3, f32, highp> highp_fmat3x3; + typedef mat<3, 4, f32, highp> highp_fmat3x4; + typedef mat<4, 2, f32, highp> highp_fmat4x2; + typedef mat<4, 3, f32, highp> highp_fmat4x3; + typedef mat<4, 4, f32, highp> highp_fmat4x4; + + typedef mat<2, 2, f32, defaultp> fmat2x2; + typedef mat<3, 2, f32, defaultp> fmat3x2; + typedef mat<4, 2, f32, defaultp> fmat4x2; + typedef mat<2, 3, f32, defaultp> fmat2x3; + typedef mat<3, 3, f32, defaultp> fmat3x3; + typedef mat<4, 3, f32, defaultp> fmat4x3; + typedef mat<2, 4, f32, defaultp> fmat2x4; + typedef mat<3, 4, f32, defaultp> fmat3x4; + typedef mat<4, 4, f32, defaultp> fmat4x4; + + typedef mat<2, 2, f32, lowp> lowp_f32mat2x2; + typedef mat<2, 3, f32, lowp> lowp_f32mat2x3; + typedef mat<2, 4, f32, lowp> lowp_f32mat2x4; + typedef mat<3, 2, f32, lowp> lowp_f32mat3x2; + typedef mat<3, 3, f32, lowp> lowp_f32mat3x3; + typedef mat<3, 4, f32, lowp> lowp_f32mat3x4; + typedef mat<4, 2, f32, lowp> lowp_f32mat4x2; + typedef mat<4, 3, f32, lowp> lowp_f32mat4x3; + typedef mat<4, 4, f32, lowp> lowp_f32mat4x4; + + typedef mat<2, 2, f32, mediump> mediump_f32mat2x2; + typedef mat<2, 3, f32, mediump> mediump_f32mat2x3; + typedef mat<2, 4, f32, mediump> mediump_f32mat2x4; + typedef mat<3, 2, f32, mediump> mediump_f32mat3x2; + typedef mat<3, 3, f32, mediump> mediump_f32mat3x3; + typedef mat<3, 4, f32, mediump> mediump_f32mat3x4; + typedef mat<4, 2, f32, mediump> mediump_f32mat4x2; + typedef mat<4, 3, f32, mediump> mediump_f32mat4x3; + typedef mat<4, 4, f32, mediump> mediump_f32mat4x4; + + typedef mat<2, 2, f32, highp> highp_f32mat2x2; + typedef mat<2, 3, f32, highp> highp_f32mat2x3; + typedef mat<2, 4, f32, highp> highp_f32mat2x4; + typedef mat<3, 2, f32, highp> highp_f32mat3x2; + typedef mat<3, 3, f32, highp> highp_f32mat3x3; + typedef mat<3, 4, f32, highp> highp_f32mat3x4; + typedef mat<4, 2, f32, highp> highp_f32mat4x2; + typedef mat<4, 3, f32, highp> highp_f32mat4x3; + typedef mat<4, 4, f32, highp> highp_f32mat4x4; + + typedef mat<2, 2, f32, defaultp> f32mat2x2; + typedef mat<3, 2, f32, defaultp> f32mat3x2; + typedef mat<4, 2, f32, defaultp> f32mat4x2; + typedef mat<2, 3, f32, defaultp> f32mat2x3; + typedef mat<3, 3, f32, defaultp> f32mat3x3; + typedef mat<4, 3, f32, defaultp> f32mat4x3; + typedef mat<2, 4, f32, defaultp> f32mat2x4; + typedef mat<3, 4, f32, defaultp> f32mat3x4; + typedef mat<4, 4, f32, defaultp> f32mat4x4; + + typedef mat<2, 2, double, lowp> lowp_dmat2x2; + typedef mat<2, 3, double, lowp> lowp_dmat2x3; + typedef mat<2, 4, double, lowp> lowp_dmat2x4; + typedef mat<3, 2, double, lowp> lowp_dmat3x2; + typedef mat<3, 3, double, lowp> lowp_dmat3x3; + typedef mat<3, 4, double, lowp> lowp_dmat3x4; + typedef mat<4, 2, double, lowp> lowp_dmat4x2; + typedef mat<4, 3, double, lowp> lowp_dmat4x3; + typedef mat<4, 4, double, lowp> lowp_dmat4x4; + + typedef mat<2, 2, double, mediump> mediump_dmat2x2; + typedef mat<2, 3, double, mediump> mediump_dmat2x3; + typedef mat<2, 4, double, mediump> mediump_dmat2x4; + typedef mat<3, 2, double, mediump> mediump_dmat3x2; + typedef mat<3, 3, double, mediump> mediump_dmat3x3; + typedef mat<3, 4, double, mediump> mediump_dmat3x4; + typedef mat<4, 2, double, mediump> mediump_dmat4x2; + typedef mat<4, 3, double, mediump> mediump_dmat4x3; + typedef mat<4, 4, double, mediump> mediump_dmat4x4; + + typedef mat<2, 2, double, highp> highp_dmat2x2; + typedef mat<2, 3, double, highp> highp_dmat2x3; + typedef mat<2, 4, double, highp> highp_dmat2x4; + typedef mat<3, 2, double, highp> highp_dmat3x2; + typedef mat<3, 3, double, highp> highp_dmat3x3; + typedef mat<3, 4, double, highp> highp_dmat3x4; + typedef mat<4, 2, double, highp> highp_dmat4x2; + typedef mat<4, 3, double, highp> highp_dmat4x3; + typedef mat<4, 4, double, highp> highp_dmat4x4; + + typedef mat<2, 2, double, defaultp> dmat2x2; + typedef mat<3, 2, double, defaultp> dmat3x2; + typedef mat<4, 2, double, defaultp> dmat4x2; + typedef mat<2, 3, double, defaultp> dmat2x3; + typedef mat<3, 3, double, defaultp> dmat3x3; + typedef mat<4, 3, double, defaultp> dmat4x3; + typedef mat<2, 4, double, defaultp> dmat2x4; + typedef mat<3, 4, double, defaultp> dmat3x4; + typedef mat<4, 4, double, defaultp> dmat4x4; + + typedef mat<2, 2, f64, lowp> lowp_f64mat2x2; + typedef mat<2, 3, f64, lowp> lowp_f64mat2x3; + typedef mat<2, 4, f64, lowp> lowp_f64mat2x4; + typedef mat<3, 2, f64, lowp> lowp_f64mat3x2; + typedef mat<3, 3, f64, lowp> lowp_f64mat3x3; + typedef mat<3, 4, f64, lowp> lowp_f64mat3x4; + typedef mat<4, 2, f64, lowp> lowp_f64mat4x2; + typedef mat<4, 3, f64, lowp> lowp_f64mat4x3; + typedef mat<4, 4, f64, lowp> lowp_f64mat4x4; + + typedef mat<2, 2, f64, mediump> mediump_f64mat2x2; + typedef mat<2, 3, f64, mediump> mediump_f64mat2x3; + typedef mat<2, 4, f64, mediump> mediump_f64mat2x4; + typedef mat<3, 2, f64, mediump> mediump_f64mat3x2; + typedef mat<3, 3, f64, mediump> mediump_f64mat3x3; + typedef mat<3, 4, f64, mediump> mediump_f64mat3x4; + typedef mat<4, 2, f64, mediump> mediump_f64mat4x2; + typedef mat<4, 3, f64, mediump> mediump_f64mat4x3; + typedef mat<4, 4, f64, mediump> mediump_f64mat4x4; + + typedef mat<2, 2, f64, highp> highp_f64mat2x2; + typedef mat<2, 3, f64, highp> highp_f64mat2x3; + typedef mat<2, 4, f64, highp> highp_f64mat2x4; + typedef mat<3, 2, f64, highp> highp_f64mat3x2; + typedef mat<3, 3, f64, highp> highp_f64mat3x3; + typedef mat<3, 4, f64, highp> highp_f64mat3x4; + typedef mat<4, 2, f64, highp> highp_f64mat4x2; + typedef mat<4, 3, f64, highp> highp_f64mat4x3; + typedef mat<4, 4, f64, highp> highp_f64mat4x4; + + typedef mat<2, 2, f64, defaultp> f64mat2x2; + typedef mat<3, 2, f64, defaultp> f64mat3x2; + typedef mat<4, 2, f64, defaultp> f64mat4x2; + typedef mat<2, 3, f64, defaultp> f64mat2x3; + typedef mat<3, 3, f64, defaultp> f64mat3x3; + typedef mat<4, 3, f64, defaultp> f64mat4x3; + typedef mat<2, 4, f64, defaultp> f64mat2x4; + typedef mat<3, 4, f64, defaultp> f64mat3x4; + typedef mat<4, 4, f64, defaultp> f64mat4x4; + + // Signed integer matrix MxN + + typedef mat<2, 2, int, lowp> lowp_imat2x2; + typedef mat<2, 3, int, lowp> lowp_imat2x3; + typedef mat<2, 4, int, lowp> lowp_imat2x4; + typedef mat<3, 2, int, lowp> lowp_imat3x2; + typedef mat<3, 3, int, lowp> lowp_imat3x3; + typedef mat<3, 4, int, lowp> lowp_imat3x4; + typedef mat<4, 2, int, lowp> lowp_imat4x2; + typedef mat<4, 3, int, lowp> lowp_imat4x3; + typedef mat<4, 4, int, lowp> lowp_imat4x4; + + typedef mat<2, 2, int, mediump> mediump_imat2x2; + typedef mat<2, 3, int, mediump> mediump_imat2x3; + typedef mat<2, 4, int, mediump> mediump_imat2x4; + typedef mat<3, 2, int, mediump> mediump_imat3x2; + typedef mat<3, 3, int, mediump> mediump_imat3x3; + typedef mat<3, 4, int, mediump> mediump_imat3x4; + typedef mat<4, 2, int, mediump> mediump_imat4x2; + typedef mat<4, 3, int, mediump> mediump_imat4x3; + typedef mat<4, 4, int, mediump> mediump_imat4x4; + + typedef mat<2, 2, int, highp> highp_imat2x2; + typedef mat<2, 3, int, highp> highp_imat2x3; + typedef mat<2, 4, int, highp> highp_imat2x4; + typedef mat<3, 2, int, highp> highp_imat3x2; + typedef mat<3, 3, int, highp> highp_imat3x3; + typedef mat<3, 4, int, highp> highp_imat3x4; + typedef mat<4, 2, int, highp> highp_imat4x2; + typedef mat<4, 3, int, highp> highp_imat4x3; + typedef mat<4, 4, int, highp> highp_imat4x4; + + typedef mat<2, 2, int, defaultp> imat2x2; + typedef mat<3, 2, int, defaultp> imat3x2; + typedef mat<4, 2, int, defaultp> imat4x2; + typedef mat<2, 3, int, defaultp> imat2x3; + typedef mat<3, 3, int, defaultp> imat3x3; + typedef mat<4, 3, int, defaultp> imat4x3; + typedef mat<2, 4, int, defaultp> imat2x4; + typedef mat<3, 4, int, defaultp> imat3x4; + typedef mat<4, 4, int, defaultp> imat4x4; + + + typedef mat<2, 2, int8, lowp> lowp_i8mat2x2; + typedef mat<2, 3, int8, lowp> lowp_i8mat2x3; + typedef mat<2, 4, int8, lowp> lowp_i8mat2x4; + typedef mat<3, 2, int8, lowp> lowp_i8mat3x2; + typedef mat<3, 3, int8, lowp> lowp_i8mat3x3; + typedef mat<3, 4, int8, lowp> lowp_i8mat3x4; + typedef mat<4, 2, int8, lowp> lowp_i8mat4x2; + typedef mat<4, 3, int8, lowp> lowp_i8mat4x3; + typedef mat<4, 4, int8, lowp> lowp_i8mat4x4; + + typedef mat<2, 2, int8, mediump> mediump_i8mat2x2; + typedef mat<2, 3, int8, mediump> mediump_i8mat2x3; + typedef mat<2, 4, int8, mediump> mediump_i8mat2x4; + typedef mat<3, 2, int8, mediump> mediump_i8mat3x2; + typedef mat<3, 3, int8, mediump> mediump_i8mat3x3; + typedef mat<3, 4, int8, mediump> mediump_i8mat3x4; + typedef mat<4, 2, int8, mediump> mediump_i8mat4x2; + typedef mat<4, 3, int8, mediump> mediump_i8mat4x3; + typedef mat<4, 4, int8, mediump> mediump_i8mat4x4; + + typedef mat<2, 2, int8, highp> highp_i8mat2x2; + typedef mat<2, 3, int8, highp> highp_i8mat2x3; + typedef mat<2, 4, int8, highp> highp_i8mat2x4; + typedef mat<3, 2, int8, highp> highp_i8mat3x2; + typedef mat<3, 3, int8, highp> highp_i8mat3x3; + typedef mat<3, 4, int8, highp> highp_i8mat3x4; + typedef mat<4, 2, int8, highp> highp_i8mat4x2; + typedef mat<4, 3, int8, highp> highp_i8mat4x3; + typedef mat<4, 4, int8, highp> highp_i8mat4x4; + + typedef mat<2, 2, int8, defaultp> i8mat2x2; + typedef mat<3, 2, int8, defaultp> i8mat3x2; + typedef mat<4, 2, int8, defaultp> i8mat4x2; + typedef mat<2, 3, int8, defaultp> i8mat2x3; + typedef mat<3, 3, int8, defaultp> i8mat3x3; + typedef mat<4, 3, int8, defaultp> i8mat4x3; + typedef mat<2, 4, int8, defaultp> i8mat2x4; + typedef mat<3, 4, int8, defaultp> i8mat3x4; + typedef mat<4, 4, int8, defaultp> i8mat4x4; + + + typedef mat<2, 2, int16, lowp> lowp_i16mat2x2; + typedef mat<2, 3, int16, lowp> lowp_i16mat2x3; + typedef mat<2, 4, int16, lowp> lowp_i16mat2x4; + typedef mat<3, 2, int16, lowp> lowp_i16mat3x2; + typedef mat<3, 3, int16, lowp> lowp_i16mat3x3; + typedef mat<3, 4, int16, lowp> lowp_i16mat3x4; + typedef mat<4, 2, int16, lowp> lowp_i16mat4x2; + typedef mat<4, 3, int16, lowp> lowp_i16mat4x3; + typedef mat<4, 4, int16, lowp> lowp_i16mat4x4; + + typedef mat<2, 2, int16, mediump> mediump_i16mat2x2; + typedef mat<2, 3, int16, mediump> mediump_i16mat2x3; + typedef mat<2, 4, int16, mediump> mediump_i16mat2x4; + typedef mat<3, 2, int16, mediump> mediump_i16mat3x2; + typedef mat<3, 3, int16, mediump> mediump_i16mat3x3; + typedef mat<3, 4, int16, mediump> mediump_i16mat3x4; + typedef mat<4, 2, int16, mediump> mediump_i16mat4x2; + typedef mat<4, 3, int16, mediump> mediump_i16mat4x3; + typedef mat<4, 4, int16, mediump> mediump_i16mat4x4; + + typedef mat<2, 2, int16, highp> highp_i16mat2x2; + typedef mat<2, 3, int16, highp> highp_i16mat2x3; + typedef mat<2, 4, int16, highp> highp_i16mat2x4; + typedef mat<3, 2, int16, highp> highp_i16mat3x2; + typedef mat<3, 3, int16, highp> highp_i16mat3x3; + typedef mat<3, 4, int16, highp> highp_i16mat3x4; + typedef mat<4, 2, int16, highp> highp_i16mat4x2; + typedef mat<4, 3, int16, highp> highp_i16mat4x3; + typedef mat<4, 4, int16, highp> highp_i16mat4x4; + + typedef mat<2, 2, int16, defaultp> i16mat2x2; + typedef mat<3, 2, int16, defaultp> i16mat3x2; + typedef mat<4, 2, int16, defaultp> i16mat4x2; + typedef mat<2, 3, int16, defaultp> i16mat2x3; + typedef mat<3, 3, int16, defaultp> i16mat3x3; + typedef mat<4, 3, int16, defaultp> i16mat4x3; + typedef mat<2, 4, int16, defaultp> i16mat2x4; + typedef mat<3, 4, int16, defaultp> i16mat3x4; + typedef mat<4, 4, int16, defaultp> i16mat4x4; + + + typedef mat<2, 2, int32, lowp> lowp_i32mat2x2; + typedef mat<2, 3, int32, lowp> lowp_i32mat2x3; + typedef mat<2, 4, int32, lowp> lowp_i32mat2x4; + typedef mat<3, 2, int32, lowp> lowp_i32mat3x2; + typedef mat<3, 3, int32, lowp> lowp_i32mat3x3; + typedef mat<3, 4, int32, lowp> lowp_i32mat3x4; + typedef mat<4, 2, int32, lowp> lowp_i32mat4x2; + typedef mat<4, 3, int32, lowp> lowp_i32mat4x3; + typedef mat<4, 4, int32, lowp> lowp_i32mat4x4; + + typedef mat<2, 2, int32, mediump> mediump_i32mat2x2; + typedef mat<2, 3, int32, mediump> mediump_i32mat2x3; + typedef mat<2, 4, int32, mediump> mediump_i32mat2x4; + typedef mat<3, 2, int32, mediump> mediump_i32mat3x2; + typedef mat<3, 3, int32, mediump> mediump_i32mat3x3; + typedef mat<3, 4, int32, mediump> mediump_i32mat3x4; + typedef mat<4, 2, int32, mediump> mediump_i32mat4x2; + typedef mat<4, 3, int32, mediump> mediump_i32mat4x3; + typedef mat<4, 4, int32, mediump> mediump_i32mat4x4; + + typedef mat<2, 2, int32, highp> highp_i32mat2x2; + typedef mat<2, 3, int32, highp> highp_i32mat2x3; + typedef mat<2, 4, int32, highp> highp_i32mat2x4; + typedef mat<3, 2, int32, highp> highp_i32mat3x2; + typedef mat<3, 3, int32, highp> highp_i32mat3x3; + typedef mat<3, 4, int32, highp> highp_i32mat3x4; + typedef mat<4, 2, int32, highp> highp_i32mat4x2; + typedef mat<4, 3, int32, highp> highp_i32mat4x3; + typedef mat<4, 4, int32, highp> highp_i32mat4x4; + + typedef mat<2, 2, int32, defaultp> i32mat2x2; + typedef mat<3, 2, int32, defaultp> i32mat3x2; + typedef mat<4, 2, int32, defaultp> i32mat4x2; + typedef mat<2, 3, int32, defaultp> i32mat2x3; + typedef mat<3, 3, int32, defaultp> i32mat3x3; + typedef mat<4, 3, int32, defaultp> i32mat4x3; + typedef mat<2, 4, int32, defaultp> i32mat2x4; + typedef mat<3, 4, int32, defaultp> i32mat3x4; + typedef mat<4, 4, int32, defaultp> i32mat4x4; + + + typedef mat<2, 2, int64, lowp> lowp_i64mat2x2; + typedef mat<2, 3, int64, lowp> lowp_i64mat2x3; + typedef mat<2, 4, int64, lowp> lowp_i64mat2x4; + typedef mat<3, 2, int64, lowp> lowp_i64mat3x2; + typedef mat<3, 3, int64, lowp> lowp_i64mat3x3; + typedef mat<3, 4, int64, lowp> lowp_i64mat3x4; + typedef mat<4, 2, int64, lowp> lowp_i64mat4x2; + typedef mat<4, 3, int64, lowp> lowp_i64mat4x3; + typedef mat<4, 4, int64, lowp> lowp_i64mat4x4; + + typedef mat<2, 2, int64, mediump> mediump_i64mat2x2; + typedef mat<2, 3, int64, mediump> mediump_i64mat2x3; + typedef mat<2, 4, int64, mediump> mediump_i64mat2x4; + typedef mat<3, 2, int64, mediump> mediump_i64mat3x2; + typedef mat<3, 3, int64, mediump> mediump_i64mat3x3; + typedef mat<3, 4, int64, mediump> mediump_i64mat3x4; + typedef mat<4, 2, int64, mediump> mediump_i64mat4x2; + typedef mat<4, 3, int64, mediump> mediump_i64mat4x3; + typedef mat<4, 4, int64, mediump> mediump_i64mat4x4; + + typedef mat<2, 2, int64, highp> highp_i64mat2x2; + typedef mat<2, 3, int64, highp> highp_i64mat2x3; + typedef mat<2, 4, int64, highp> highp_i64mat2x4; + typedef mat<3, 2, int64, highp> highp_i64mat3x2; + typedef mat<3, 3, int64, highp> highp_i64mat3x3; + typedef mat<3, 4, int64, highp> highp_i64mat3x4; + typedef mat<4, 2, int64, highp> highp_i64mat4x2; + typedef mat<4, 3, int64, highp> highp_i64mat4x3; + typedef mat<4, 4, int64, highp> highp_i64mat4x4; + + typedef mat<2, 2, int64, defaultp> i64mat2x2; + typedef mat<3, 2, int64, defaultp> i64mat3x2; + typedef mat<4, 2, int64, defaultp> i64mat4x2; + typedef mat<2, 3, int64, defaultp> i64mat2x3; + typedef mat<3, 3, int64, defaultp> i64mat3x3; + typedef mat<4, 3, int64, defaultp> i64mat4x3; + typedef mat<2, 4, int64, defaultp> i64mat2x4; + typedef mat<3, 4, int64, defaultp> i64mat3x4; + typedef mat<4, 4, int64, defaultp> i64mat4x4; + + + // Unsigned integer matrix MxN + + typedef mat<2, 2, uint, lowp> lowp_umat2x2; + typedef mat<2, 3, uint, lowp> lowp_umat2x3; + typedef mat<2, 4, uint, lowp> lowp_umat2x4; + typedef mat<3, 2, uint, lowp> lowp_umat3x2; + typedef mat<3, 3, uint, lowp> lowp_umat3x3; + typedef mat<3, 4, uint, lowp> lowp_umat3x4; + typedef mat<4, 2, uint, lowp> lowp_umat4x2; + typedef mat<4, 3, uint, lowp> lowp_umat4x3; + typedef mat<4, 4, uint, lowp> lowp_umat4x4; + + typedef mat<2, 2, uint, mediump> mediump_umat2x2; + typedef mat<2, 3, uint, mediump> mediump_umat2x3; + typedef mat<2, 4, uint, mediump> mediump_umat2x4; + typedef mat<3, 2, uint, mediump> mediump_umat3x2; + typedef mat<3, 3, uint, mediump> mediump_umat3x3; + typedef mat<3, 4, uint, mediump> mediump_umat3x4; + typedef mat<4, 2, uint, mediump> mediump_umat4x2; + typedef mat<4, 3, uint, mediump> mediump_umat4x3; + typedef mat<4, 4, uint, mediump> mediump_umat4x4; + + typedef mat<2, 2, uint, highp> highp_umat2x2; + typedef mat<2, 3, uint, highp> highp_umat2x3; + typedef mat<2, 4, uint, highp> highp_umat2x4; + typedef mat<3, 2, uint, highp> highp_umat3x2; + typedef mat<3, 3, uint, highp> highp_umat3x3; + typedef mat<3, 4, uint, highp> highp_umat3x4; + typedef mat<4, 2, uint, highp> highp_umat4x2; + typedef mat<4, 3, uint, highp> highp_umat4x3; + typedef mat<4, 4, uint, highp> highp_umat4x4; + + typedef mat<2, 2, uint, defaultp> umat2x2; + typedef mat<3, 2, uint, defaultp> umat3x2; + typedef mat<4, 2, uint, defaultp> umat4x2; + typedef mat<2, 3, uint, defaultp> umat2x3; + typedef mat<3, 3, uint, defaultp> umat3x3; + typedef mat<4, 3, uint, defaultp> umat4x3; + typedef mat<2, 4, uint, defaultp> umat2x4; + typedef mat<3, 4, uint, defaultp> umat3x4; + typedef mat<4, 4, uint, defaultp> umat4x4; + + + typedef mat<2, 2, uint8, lowp> lowp_u8mat2x2; + typedef mat<2, 3, uint8, lowp> lowp_u8mat2x3; + typedef mat<2, 4, uint8, lowp> lowp_u8mat2x4; + typedef mat<3, 2, uint8, lowp> lowp_u8mat3x2; + typedef mat<3, 3, uint8, lowp> lowp_u8mat3x3; + typedef mat<3, 4, uint8, lowp> lowp_u8mat3x4; + typedef mat<4, 2, uint8, lowp> lowp_u8mat4x2; + typedef mat<4, 3, uint8, lowp> lowp_u8mat4x3; + typedef mat<4, 4, uint8, lowp> lowp_u8mat4x4; + + typedef mat<2, 2, uint8, mediump> mediump_u8mat2x2; + typedef mat<2, 3, uint8, mediump> mediump_u8mat2x3; + typedef mat<2, 4, uint8, mediump> mediump_u8mat2x4; + typedef mat<3, 2, uint8, mediump> mediump_u8mat3x2; + typedef mat<3, 3, uint8, mediump> mediump_u8mat3x3; + typedef mat<3, 4, uint8, mediump> mediump_u8mat3x4; + typedef mat<4, 2, uint8, mediump> mediump_u8mat4x2; + typedef mat<4, 3, uint8, mediump> mediump_u8mat4x3; + typedef mat<4, 4, uint8, mediump> mediump_u8mat4x4; + + typedef mat<2, 2, uint8, highp> highp_u8mat2x2; + typedef mat<2, 3, uint8, highp> highp_u8mat2x3; + typedef mat<2, 4, uint8, highp> highp_u8mat2x4; + typedef mat<3, 2, uint8, highp> highp_u8mat3x2; + typedef mat<3, 3, uint8, highp> highp_u8mat3x3; + typedef mat<3, 4, uint8, highp> highp_u8mat3x4; + typedef mat<4, 2, uint8, highp> highp_u8mat4x2; + typedef mat<4, 3, uint8, highp> highp_u8mat4x3; + typedef mat<4, 4, uint8, highp> highp_u8mat4x4; + + typedef mat<2, 2, uint8, defaultp> u8mat2x2; + typedef mat<3, 2, uint8, defaultp> u8mat3x2; + typedef mat<4, 2, uint8, defaultp> u8mat4x2; + typedef mat<2, 3, uint8, defaultp> u8mat2x3; + typedef mat<3, 3, uint8, defaultp> u8mat3x3; + typedef mat<4, 3, uint8, defaultp> u8mat4x3; + typedef mat<2, 4, uint8, defaultp> u8mat2x4; + typedef mat<3, 4, uint8, defaultp> u8mat3x4; + typedef mat<4, 4, uint8, defaultp> u8mat4x4; + + + typedef mat<2, 2, uint16, lowp> lowp_u16mat2x2; + typedef mat<2, 3, uint16, lowp> lowp_u16mat2x3; + typedef mat<2, 4, uint16, lowp> lowp_u16mat2x4; + typedef mat<3, 2, uint16, lowp> lowp_u16mat3x2; + typedef mat<3, 3, uint16, lowp> lowp_u16mat3x3; + typedef mat<3, 4, uint16, lowp> lowp_u16mat3x4; + typedef mat<4, 2, uint16, lowp> lowp_u16mat4x2; + typedef mat<4, 3, uint16, lowp> lowp_u16mat4x3; + typedef mat<4, 4, uint16, lowp> lowp_u16mat4x4; + + typedef mat<2, 2, uint16, mediump> mediump_u16mat2x2; + typedef mat<2, 3, uint16, mediump> mediump_u16mat2x3; + typedef mat<2, 4, uint16, mediump> mediump_u16mat2x4; + typedef mat<3, 2, uint16, mediump> mediump_u16mat3x2; + typedef mat<3, 3, uint16, mediump> mediump_u16mat3x3; + typedef mat<3, 4, uint16, mediump> mediump_u16mat3x4; + typedef mat<4, 2, uint16, mediump> mediump_u16mat4x2; + typedef mat<4, 3, uint16, mediump> mediump_u16mat4x3; + typedef mat<4, 4, uint16, mediump> mediump_u16mat4x4; + + typedef mat<2, 2, uint16, highp> highp_u16mat2x2; + typedef mat<2, 3, uint16, highp> highp_u16mat2x3; + typedef mat<2, 4, uint16, highp> highp_u16mat2x4; + typedef mat<3, 2, uint16, highp> highp_u16mat3x2; + typedef mat<3, 3, uint16, highp> highp_u16mat3x3; + typedef mat<3, 4, uint16, highp> highp_u16mat3x4; + typedef mat<4, 2, uint16, highp> highp_u16mat4x2; + typedef mat<4, 3, uint16, highp> highp_u16mat4x3; + typedef mat<4, 4, uint16, highp> highp_u16mat4x4; + + typedef mat<2, 2, uint16, defaultp> u16mat2x2; + typedef mat<3, 2, uint16, defaultp> u16mat3x2; + typedef mat<4, 2, uint16, defaultp> u16mat4x2; + typedef mat<2, 3, uint16, defaultp> u16mat2x3; + typedef mat<3, 3, uint16, defaultp> u16mat3x3; + typedef mat<4, 3, uint16, defaultp> u16mat4x3; + typedef mat<2, 4, uint16, defaultp> u16mat2x4; + typedef mat<3, 4, uint16, defaultp> u16mat3x4; + typedef mat<4, 4, uint16, defaultp> u16mat4x4; + + + typedef mat<2, 2, uint32, lowp> lowp_u32mat2x2; + typedef mat<2, 3, uint32, lowp> lowp_u32mat2x3; + typedef mat<2, 4, uint32, lowp> lowp_u32mat2x4; + typedef mat<3, 2, uint32, lowp> lowp_u32mat3x2; + typedef mat<3, 3, uint32, lowp> lowp_u32mat3x3; + typedef mat<3, 4, uint32, lowp> lowp_u32mat3x4; + typedef mat<4, 2, uint32, lowp> lowp_u32mat4x2; + typedef mat<4, 3, uint32, lowp> lowp_u32mat4x3; + typedef mat<4, 4, uint32, lowp> lowp_u32mat4x4; + + typedef mat<2, 2, uint32, mediump> mediump_u32mat2x2; + typedef mat<2, 3, uint32, mediump> mediump_u32mat2x3; + typedef mat<2, 4, uint32, mediump> mediump_u32mat2x4; + typedef mat<3, 2, uint32, mediump> mediump_u32mat3x2; + typedef mat<3, 3, uint32, mediump> mediump_u32mat3x3; + typedef mat<3, 4, uint32, mediump> mediump_u32mat3x4; + typedef mat<4, 2, uint32, mediump> mediump_u32mat4x2; + typedef mat<4, 3, uint32, mediump> mediump_u32mat4x3; + typedef mat<4, 4, uint32, mediump> mediump_u32mat4x4; + + typedef mat<2, 2, uint32, highp> highp_u32mat2x2; + typedef mat<2, 3, uint32, highp> highp_u32mat2x3; + typedef mat<2, 4, uint32, highp> highp_u32mat2x4; + typedef mat<3, 2, uint32, highp> highp_u32mat3x2; + typedef mat<3, 3, uint32, highp> highp_u32mat3x3; + typedef mat<3, 4, uint32, highp> highp_u32mat3x4; + typedef mat<4, 2, uint32, highp> highp_u32mat4x2; + typedef mat<4, 3, uint32, highp> highp_u32mat4x3; + typedef mat<4, 4, uint32, highp> highp_u32mat4x4; + + typedef mat<2, 2, uint32, defaultp> u32mat2x2; + typedef mat<3, 2, uint32, defaultp> u32mat3x2; + typedef mat<4, 2, uint32, defaultp> u32mat4x2; + typedef mat<2, 3, uint32, defaultp> u32mat2x3; + typedef mat<3, 3, uint32, defaultp> u32mat3x3; + typedef mat<4, 3, uint32, defaultp> u32mat4x3; + typedef mat<2, 4, uint32, defaultp> u32mat2x4; + typedef mat<3, 4, uint32, defaultp> u32mat3x4; + typedef mat<4, 4, uint32, defaultp> u32mat4x4; + + + typedef mat<2, 2, uint64, lowp> lowp_u64mat2x2; + typedef mat<2, 3, uint64, lowp> lowp_u64mat2x3; + typedef mat<2, 4, uint64, lowp> lowp_u64mat2x4; + typedef mat<3, 2, uint64, lowp> lowp_u64mat3x2; + typedef mat<3, 3, uint64, lowp> lowp_u64mat3x3; + typedef mat<3, 4, uint64, lowp> lowp_u64mat3x4; + typedef mat<4, 2, uint64, lowp> lowp_u64mat4x2; + typedef mat<4, 3, uint64, lowp> lowp_u64mat4x3; + typedef mat<4, 4, uint64, lowp> lowp_u64mat4x4; + + typedef mat<2, 2, uint64, mediump> mediump_u64mat2x2; + typedef mat<2, 3, uint64, mediump> mediump_u64mat2x3; + typedef mat<2, 4, uint64, mediump> mediump_u64mat2x4; + typedef mat<3, 2, uint64, mediump> mediump_u64mat3x2; + typedef mat<3, 3, uint64, mediump> mediump_u64mat3x3; + typedef mat<3, 4, uint64, mediump> mediump_u64mat3x4; + typedef mat<4, 2, uint64, mediump> mediump_u64mat4x2; + typedef mat<4, 3, uint64, mediump> mediump_u64mat4x3; + typedef mat<4, 4, uint64, mediump> mediump_u64mat4x4; + + typedef mat<2, 2, uint64, highp> highp_u64mat2x2; + typedef mat<2, 3, uint64, highp> highp_u64mat2x3; + typedef mat<2, 4, uint64, highp> highp_u64mat2x4; + typedef mat<3, 2, uint64, highp> highp_u64mat3x2; + typedef mat<3, 3, uint64, highp> highp_u64mat3x3; + typedef mat<3, 4, uint64, highp> highp_u64mat3x4; + typedef mat<4, 2, uint64, highp> highp_u64mat4x2; + typedef mat<4, 3, uint64, highp> highp_u64mat4x3; + typedef mat<4, 4, uint64, highp> highp_u64mat4x4; + + typedef mat<2, 2, uint64, defaultp> u64mat2x2; + typedef mat<3, 2, uint64, defaultp> u64mat3x2; + typedef mat<4, 2, uint64, defaultp> u64mat4x2; + typedef mat<2, 3, uint64, defaultp> u64mat2x3; + typedef mat<3, 3, uint64, defaultp> u64mat3x3; + typedef mat<4, 3, uint64, defaultp> u64mat4x3; + typedef mat<2, 4, uint64, defaultp> u64mat2x4; + typedef mat<3, 4, uint64, defaultp> u64mat3x4; + typedef mat<4, 4, uint64, defaultp> u64mat4x4; + + // Quaternion + + typedef qua lowp_quat; + typedef qua mediump_quat; + typedef qua highp_quat; + typedef qua quat; + + typedef qua lowp_fquat; + typedef qua mediump_fquat; + typedef qua highp_fquat; + typedef qua fquat; + + typedef qua lowp_f32quat; + typedef qua mediump_f32quat; + typedef qua highp_f32quat; + typedef qua f32quat; + + typedef qua lowp_dquat; + typedef qua mediump_dquat; + typedef qua highp_dquat; + typedef qua dquat; + + typedef qua lowp_f64quat; + typedef qua mediump_f64quat; + typedef qua highp_f64quat; + typedef qua f64quat; +}//namespace glm + + diff --git a/NothinFancy/dep/include/glm/geometric.hpp b/NothinFancy/dep/include/glm/geometric.hpp new file mode 100644 index 0000000..c068a3c --- /dev/null +++ b/NothinFancy/dep/include/glm/geometric.hpp @@ -0,0 +1,116 @@ +/// @ref core +/// @file glm/geometric.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions +/// +/// @defgroup core_func_geometric Geometric functions +/// @ingroup core +/// +/// These operate on vectors as vectors, not component-wise. +/// +/// Include to use these core features. + +#pragma once + +#include "detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_func_geometric + /// @{ + + /// Returns the length of x, i.e., sqrt(x * x). + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL length man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL T length(vec const& x); + + /// Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL distance man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL T distance(vec const& p0, vec const& p1); + + /// Returns the dot product of x and y, i.e., result = x * y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL dot man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL T dot(vec const& x, vec const& y); + + /// Returns the cross product of x and y. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL cross man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL vec<3, T, Q> cross(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + /// Returns a vector in the same direction as x but with length of 1. + /// According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefined and generate an error. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL normalize man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL vec normalize(vec const& x); + + /// If dot(Nref, I) < 0.0, return N, otherwise, return -N. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL faceforward man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL vec faceforward( + vec const& N, + vec const& I, + vec const& Nref); + + /// For the incident vector I and surface orientation N, + /// returns the reflection direction : result = I - 2.0 * dot(N, I) * N. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL reflect man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL vec reflect( + vec const& I, + vec const& N); + + /// For the incident vector I and surface normal N, + /// and the ratio of indices of refraction eta, + /// return the refraction vector. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL refract man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL vec refract( + vec const& I, + vec const& N, + T eta); + + /// @} +}//namespace glm + +#include "detail/func_geometric.inl" diff --git a/NothinFancy/dep/include/glm/glm.hpp b/NothinFancy/dep/include/glm/glm.hpp new file mode 100644 index 0000000..8b61064 --- /dev/null +++ b/NothinFancy/dep/include/glm/glm.hpp @@ -0,0 +1,136 @@ +/// @ref core +/// @file glm/glm.hpp +/// +/// @defgroup core Core features +/// +/// @brief Features that implement in C++ the GLSL specification as closely as possible. +/// +/// The GLM core consists of C++ types that mirror GLSL types and +/// C++ functions that mirror the GLSL functions. +/// +/// The best documentation for GLM Core is the current GLSL specification, +/// version 4.2 +/// (pdf file). +/// +/// GLM core functionalities require to be included to be used. +/// +/// +/// @defgroup core_vector Vector types +/// +/// Vector types of two to four components with an exhaustive set of operators. +/// +/// @ingroup core +/// +/// +/// @defgroup core_vector_precision Vector types with precision qualifiers +/// +/// @brief Vector types with precision qualifiers which may result in various precision in term of ULPs +/// +/// GLSL allows defining qualifiers for particular variables. +/// With OpenGL's GLSL, these qualifiers have no effect; they are there for compatibility, +/// with OpenGL ES's GLSL, these qualifiers do have an effect. +/// +/// C++ has no language equivalent to qualifier qualifiers. So GLM provides the next-best thing: +/// a number of typedefs that use a particular qualifier. +/// +/// None of these types make any guarantees about the actual qualifier used. +/// +/// @ingroup core +/// +/// +/// @defgroup core_matrix Matrix types +/// +/// Matrix types of with C columns and R rows where C and R are values between 2 to 4 included. +/// These types have exhaustive sets of operators. +/// +/// @ingroup core +/// +/// +/// @defgroup core_matrix_precision Matrix types with precision qualifiers +/// +/// @brief Matrix types with precision qualifiers which may result in various precision in term of ULPs +/// +/// GLSL allows defining qualifiers for particular variables. +/// With OpenGL's GLSL, these qualifiers have no effect; they are there for compatibility, +/// with OpenGL ES's GLSL, these qualifiers do have an effect. +/// +/// C++ has no language equivalent to qualifier qualifiers. So GLM provides the next-best thing: +/// a number of typedefs that use a particular qualifier. +/// +/// None of these types make any guarantees about the actual qualifier used. +/// +/// @ingroup core +/// +/// +/// @defgroup ext Stable extensions +/// +/// @brief Additional features not specified by GLSL specification. +/// +/// EXT extensions are fully tested and documented. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions at once by +/// including . Otherwise, each extension needs to be included a specific file. +/// +/// +/// @defgroup gtc Recommended extensions +/// +/// @brief Additional features not specified by GLSL specification. +/// +/// GTC extensions aim to be stable with tests and documentation. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions at once by +/// including . Otherwise, each extension needs to be included a specific file. +/// +/// +/// @defgroup gtx Experimental extensions +/// +/// @brief Experimental features not specified by GLSL specification. +/// +/// Experimental extensions are useful functions and types, but the development of +/// their API and functionality is not necessarily stable. They can change +/// substantially between versions. Backwards compatibility is not much of an issue +/// for them. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions +/// at once by including . Otherwise, each extension needs to be +/// included a specific file. +/// +/// @mainpage OpenGL Mathematics (GLM) +/// - Website: glm.g-truc.net +/// - GLM API documentation +/// - GLM Manual + +#include "detail/_fixes.hpp" + +#include "detail/setup.hpp" + +#pragma once + +#include +#include +#include +#include +#include +#include "fwd.hpp" + +#include "vec2.hpp" +#include "vec3.hpp" +#include "vec4.hpp" +#include "mat2x2.hpp" +#include "mat2x3.hpp" +#include "mat2x4.hpp" +#include "mat3x2.hpp" +#include "mat3x3.hpp" +#include "mat3x4.hpp" +#include "mat4x2.hpp" +#include "mat4x3.hpp" +#include "mat4x4.hpp" + +#include "trigonometric.hpp" +#include "exponential.hpp" +#include "common.hpp" +#include "packing.hpp" +#include "geometric.hpp" +#include "matrix.hpp" +#include "vector_relational.hpp" +#include "integer.hpp" diff --git a/NothinFancy/dep/include/glm/gtc/bitfield.hpp b/NothinFancy/dep/include/glm/gtc/bitfield.hpp new file mode 100644 index 0000000..084fbe7 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/bitfield.hpp @@ -0,0 +1,266 @@ +/// @ref gtc_bitfield +/// @file glm/gtc/bitfield.hpp +/// +/// @see core (dependence) +/// @see gtc_bitfield (dependence) +/// +/// @defgroup gtc_bitfield GLM_GTC_bitfield +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Allow to perform bit operations on integer values + +#include "../detail/setup.hpp" + +#pragma once + +// Dependencies +#include "../ext/scalar_int_sized.hpp" +#include "../ext/scalar_uint_sized.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_vectorize.hpp" +#include "type_precision.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_bitfield extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_bitfield + /// @{ + + /// Build a mask of 'count' bits + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL genIUType mask(genIUType Bits); + + /// Build a mask of 'count' bits + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL vec mask(vec const& v); + + /// Rotate all bits to the right. All the bits dropped in the right side are inserted back on the left side. + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL genIUType bitfieldRotateRight(genIUType In, int Shift); + + /// Rotate all bits to the right. All the bits dropped in the right side are inserted back on the left side. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL vec bitfieldRotateRight(vec const& In, int Shift); + + /// Rotate all bits to the left. All the bits dropped in the left side are inserted back on the right side. + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL genIUType bitfieldRotateLeft(genIUType In, int Shift); + + /// Rotate all bits to the left. All the bits dropped in the left side are inserted back on the right side. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL vec bitfieldRotateLeft(vec const& In, int Shift); + + /// Set to 1 a range of bits. + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount); + + /// Set to 1 a range of bits. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL vec bitfieldFillOne(vec const& Value, int FirstBit, int BitCount); + + /// Set to 0 a range of bits. + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount); + + /// Set to 0 a range of bits. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL vec bitfieldFillZero(vec const& Value, int FirstBit, int BitCount); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int16 bitfieldInterleave(int8 x, int8 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint16 bitfieldInterleave(uint8 x, uint8 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of v.x followed by the first bit of v.y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint16 bitfieldInterleave(u8vec2 const& v); + + /// Deinterleaves the bits of x. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL glm::u8vec2 bitfieldDeinterleave(glm::uint16 x); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int32 bitfieldInterleave(int16 x, int16 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint32 bitfieldInterleave(uint16 x, uint16 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of v.x followed by the first bit of v.y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint32 bitfieldInterleave(u16vec2 const& v); + + /// Deinterleaves the bits of x. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL glm::u16vec2 bitfieldDeinterleave(glm::uint32 x); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of v.x followed by the first bit of v.y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint64 bitfieldInterleave(u32vec2 const& v); + + /// Deinterleaves the bits of x. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL glm::u32vec2 bitfieldDeinterleave(glm::uint64 x); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y, int32 z); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z); + + /// Interleaves the bits of x, y, z and w. + /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w); + + /// Interleaves the bits of x, y, z and w. + /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w); + + /// Interleaves the bits of x, y, z and w. + /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z, int16 w); + + /// Interleaves the bits of x, y, z and w. + /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w); + + /// @} +} //namespace glm + +#include "bitfield.inl" diff --git a/NothinFancy/dep/include/glm/gtc/bitfield.inl b/NothinFancy/dep/include/glm/gtc/bitfield.inl new file mode 100644 index 0000000..06cf188 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/bitfield.inl @@ -0,0 +1,626 @@ +/// @ref gtc_bitfield + +#include "../simd/integer.h" + +namespace glm{ +namespace detail +{ + template + GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y); + + template + GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z); + + template + GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z, PARAM w); + + template<> + GLM_FUNC_QUALIFIER glm::uint16 bitfieldInterleave(glm::uint8 x, glm::uint8 y) + { + glm::uint16 REG1(x); + glm::uint16 REG2(y); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0x0F0F); + REG2 = ((REG2 << 4) | REG2) & static_cast(0x0F0F); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x3333); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x3333); + + REG1 = ((REG1 << 1) | REG1) & static_cast(0x5555); + REG2 = ((REG2 << 1) | REG2) & static_cast(0x5555); + + return REG1 | static_cast(REG2 << 1); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint16 x, glm::uint16 y) + { + glm::uint32 REG1(x); + glm::uint32 REG2(y); + + REG1 = ((REG1 << 8) | REG1) & static_cast(0x00FF00FF); + REG2 = ((REG2 << 8) | REG2) & static_cast(0x00FF00FF); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0x0F0F0F0F); + REG2 = ((REG2 << 4) | REG2) & static_cast(0x0F0F0F0F); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x33333333); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x33333333); + + REG1 = ((REG1 << 1) | REG1) & static_cast(0x55555555); + REG2 = ((REG2 << 1) | REG2) & static_cast(0x55555555); + + return REG1 | (REG2 << 1); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y) + { + glm::uint64 REG1(x); + glm::uint64 REG2(y); + + REG1 = ((REG1 << 16) | REG1) & static_cast(0x0000FFFF0000FFFFull); + REG2 = ((REG2 << 16) | REG2) & static_cast(0x0000FFFF0000FFFFull); + + REG1 = ((REG1 << 8) | REG1) & static_cast(0x00FF00FF00FF00FFull); + REG2 = ((REG2 << 8) | REG2) & static_cast(0x00FF00FF00FF00FFull); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0x0F0F0F0F0F0F0F0Full); + REG2 = ((REG2 << 4) | REG2) & static_cast(0x0F0F0F0F0F0F0F0Full); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x3333333333333333ull); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x3333333333333333ull); + + REG1 = ((REG1 << 1) | REG1) & static_cast(0x5555555555555555ull); + REG2 = ((REG2 << 1) | REG2) & static_cast(0x5555555555555555ull); + + return REG1 | (REG2 << 1); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y, glm::uint8 z) + { + glm::uint32 REG1(x); + glm::uint32 REG2(y); + glm::uint32 REG3(z); + + REG1 = ((REG1 << 16) | REG1) & static_cast(0xFF0000FFu); + REG2 = ((REG2 << 16) | REG2) & static_cast(0xFF0000FFu); + REG3 = ((REG3 << 16) | REG3) & static_cast(0xFF0000FFu); + + REG1 = ((REG1 << 8) | REG1) & static_cast(0x0F00F00Fu); + REG2 = ((REG2 << 8) | REG2) & static_cast(0x0F00F00Fu); + REG3 = ((REG3 << 8) | REG3) & static_cast(0x0F00F00Fu); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0xC30C30C3u); + REG2 = ((REG2 << 4) | REG2) & static_cast(0xC30C30C3u); + REG3 = ((REG3 << 4) | REG3) & static_cast(0xC30C30C3u); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x49249249u); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x49249249u); + REG3 = ((REG3 << 2) | REG3) & static_cast(0x49249249u); + + return REG1 | (REG2 << 1) | (REG3 << 2); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y, glm::uint16 z) + { + glm::uint64 REG1(x); + glm::uint64 REG2(y); + glm::uint64 REG3(z); + + REG1 = ((REG1 << 32) | REG1) & static_cast(0xFFFF00000000FFFFull); + REG2 = ((REG2 << 32) | REG2) & static_cast(0xFFFF00000000FFFFull); + REG3 = ((REG3 << 32) | REG3) & static_cast(0xFFFF00000000FFFFull); + + REG1 = ((REG1 << 16) | REG1) & static_cast(0x00FF0000FF0000FFull); + REG2 = ((REG2 << 16) | REG2) & static_cast(0x00FF0000FF0000FFull); + REG3 = ((REG3 << 16) | REG3) & static_cast(0x00FF0000FF0000FFull); + + REG1 = ((REG1 << 8) | REG1) & static_cast(0xF00F00F00F00F00Full); + REG2 = ((REG2 << 8) | REG2) & static_cast(0xF00F00F00F00F00Full); + REG3 = ((REG3 << 8) | REG3) & static_cast(0xF00F00F00F00F00Full); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0x30C30C30C30C30C3ull); + REG2 = ((REG2 << 4) | REG2) & static_cast(0x30C30C30C30C30C3ull); + REG3 = ((REG3 << 4) | REG3) & static_cast(0x30C30C30C30C30C3ull); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x9249249249249249ull); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x9249249249249249ull); + REG3 = ((REG3 << 2) | REG3) & static_cast(0x9249249249249249ull); + + return REG1 | (REG2 << 1) | (REG3 << 2); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y, glm::uint32 z) + { + glm::uint64 REG1(x); + glm::uint64 REG2(y); + glm::uint64 REG3(z); + + REG1 = ((REG1 << 32) | REG1) & static_cast(0xFFFF00000000FFFFull); + REG2 = ((REG2 << 32) | REG2) & static_cast(0xFFFF00000000FFFFull); + REG3 = ((REG3 << 32) | REG3) & static_cast(0xFFFF00000000FFFFull); + + REG1 = ((REG1 << 16) | REG1) & static_cast(0x00FF0000FF0000FFull); + REG2 = ((REG2 << 16) | REG2) & static_cast(0x00FF0000FF0000FFull); + REG3 = ((REG3 << 16) | REG3) & static_cast(0x00FF0000FF0000FFull); + + REG1 = ((REG1 << 8) | REG1) & static_cast(0xF00F00F00F00F00Full); + REG2 = ((REG2 << 8) | REG2) & static_cast(0xF00F00F00F00F00Full); + REG3 = ((REG3 << 8) | REG3) & static_cast(0xF00F00F00F00F00Full); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0x30C30C30C30C30C3ull); + REG2 = ((REG2 << 4) | REG2) & static_cast(0x30C30C30C30C30C3ull); + REG3 = ((REG3 << 4) | REG3) & static_cast(0x30C30C30C30C30C3ull); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x9249249249249249ull); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x9249249249249249ull); + REG3 = ((REG3 << 2) | REG3) & static_cast(0x9249249249249249ull); + + return REG1 | (REG2 << 1) | (REG3 << 2); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y, glm::uint8 z, glm::uint8 w) + { + glm::uint32 REG1(x); + glm::uint32 REG2(y); + glm::uint32 REG3(z); + glm::uint32 REG4(w); + + REG1 = ((REG1 << 12) | REG1) & static_cast(0x000F000Fu); + REG2 = ((REG2 << 12) | REG2) & static_cast(0x000F000Fu); + REG3 = ((REG3 << 12) | REG3) & static_cast(0x000F000Fu); + REG4 = ((REG4 << 12) | REG4) & static_cast(0x000F000Fu); + + REG1 = ((REG1 << 6) | REG1) & static_cast(0x03030303u); + REG2 = ((REG2 << 6) | REG2) & static_cast(0x03030303u); + REG3 = ((REG3 << 6) | REG3) & static_cast(0x03030303u); + REG4 = ((REG4 << 6) | REG4) & static_cast(0x03030303u); + + REG1 = ((REG1 << 3) | REG1) & static_cast(0x11111111u); + REG2 = ((REG2 << 3) | REG2) & static_cast(0x11111111u); + REG3 = ((REG3 << 3) | REG3) & static_cast(0x11111111u); + REG4 = ((REG4 << 3) | REG4) & static_cast(0x11111111u); + + return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y, glm::uint16 z, glm::uint16 w) + { + glm::uint64 REG1(x); + glm::uint64 REG2(y); + glm::uint64 REG3(z); + glm::uint64 REG4(w); + + REG1 = ((REG1 << 24) | REG1) & static_cast(0x000000FF000000FFull); + REG2 = ((REG2 << 24) | REG2) & static_cast(0x000000FF000000FFull); + REG3 = ((REG3 << 24) | REG3) & static_cast(0x000000FF000000FFull); + REG4 = ((REG4 << 24) | REG4) & static_cast(0x000000FF000000FFull); + + REG1 = ((REG1 << 12) | REG1) & static_cast(0x000F000F000F000Full); + REG2 = ((REG2 << 12) | REG2) & static_cast(0x000F000F000F000Full); + REG3 = ((REG3 << 12) | REG3) & static_cast(0x000F000F000F000Full); + REG4 = ((REG4 << 12) | REG4) & static_cast(0x000F000F000F000Full); + + REG1 = ((REG1 << 6) | REG1) & static_cast(0x0303030303030303ull); + REG2 = ((REG2 << 6) | REG2) & static_cast(0x0303030303030303ull); + REG3 = ((REG3 << 6) | REG3) & static_cast(0x0303030303030303ull); + REG4 = ((REG4 << 6) | REG4) & static_cast(0x0303030303030303ull); + + REG1 = ((REG1 << 3) | REG1) & static_cast(0x1111111111111111ull); + REG2 = ((REG2 << 3) | REG2) & static_cast(0x1111111111111111ull); + REG3 = ((REG3 << 3) | REG3) & static_cast(0x1111111111111111ull); + REG4 = ((REG4 << 3) | REG4) & static_cast(0x1111111111111111ull); + + return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3); + } +}//namespace detail + + template + GLM_FUNC_QUALIFIER genIUType mask(genIUType Bits) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'mask' accepts only integer values"); + + return Bits >= sizeof(genIUType) * 8 ? ~static_cast(0) : (static_cast(1) << Bits) - static_cast(1); + } + + template + GLM_FUNC_QUALIFIER vec mask(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'mask' accepts only integer values"); + + return detail::functor1::call(mask, v); + } + + template + GLM_FUNC_QUALIFIER genIType bitfieldRotateRight(genIType In, int Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldRotateRight' accepts only integer values"); + + int const BitSize = static_cast(sizeof(genIType) * 8); + return (In << static_cast(Shift)) | (In >> static_cast(BitSize - Shift)); + } + + template + GLM_FUNC_QUALIFIER vec bitfieldRotateRight(vec const& In, int Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldRotateRight' accepts only integer values"); + + int const BitSize = static_cast(sizeof(T) * 8); + return (In << static_cast(Shift)) | (In >> static_cast(BitSize - Shift)); + } + + template + GLM_FUNC_QUALIFIER genIType bitfieldRotateLeft(genIType In, int Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldRotateLeft' accepts only integer values"); + + int const BitSize = static_cast(sizeof(genIType) * 8); + return (In >> static_cast(Shift)) | (In << static_cast(BitSize - Shift)); + } + + template + GLM_FUNC_QUALIFIER vec bitfieldRotateLeft(vec const& In, int Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldRotateLeft' accepts only integer values"); + + int const BitSize = static_cast(sizeof(T) * 8); + return (In >> static_cast(Shift)) | (In << static_cast(BitSize - Shift)); + } + + template + GLM_FUNC_QUALIFIER genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount) + { + return Value | static_cast(mask(BitCount) << FirstBit); + } + + template + GLM_FUNC_QUALIFIER vec bitfieldFillOne(vec const& Value, int FirstBit, int BitCount) + { + return Value | static_cast(mask(BitCount) << FirstBit); + } + + template + GLM_FUNC_QUALIFIER genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount) + { + return Value & static_cast(~(mask(BitCount) << FirstBit)); + } + + template + GLM_FUNC_QUALIFIER vec bitfieldFillZero(vec const& Value, int FirstBit, int BitCount) + { + return Value & static_cast(~(mask(BitCount) << FirstBit)); + } + + GLM_FUNC_QUALIFIER int16 bitfieldInterleave(int8 x, int8 y) + { + union sign8 + { + int8 i; + uint8 u; + } sign_x, sign_y; + + union sign16 + { + int16 i; + uint16 u; + } result; + + sign_x.i = x; + sign_y.i = y; + result.u = bitfieldInterleave(sign_x.u, sign_y.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint16 bitfieldInterleave(uint8 x, uint8 y) + { + return detail::bitfieldInterleave(x, y); + } + + GLM_FUNC_QUALIFIER uint16 bitfieldInterleave(u8vec2 const& v) + { + return detail::bitfieldInterleave(v.x, v.y); + } + + GLM_FUNC_QUALIFIER u8vec2 bitfieldDeinterleave(glm::uint16 x) + { + uint16 REG1(x); + uint16 REG2(x >>= 1); + + REG1 = REG1 & static_cast(0x5555); + REG2 = REG2 & static_cast(0x5555); + + REG1 = ((REG1 >> 1) | REG1) & static_cast(0x3333); + REG2 = ((REG2 >> 1) | REG2) & static_cast(0x3333); + + REG1 = ((REG1 >> 2) | REG1) & static_cast(0x0F0F); + REG2 = ((REG2 >> 2) | REG2) & static_cast(0x0F0F); + + REG1 = ((REG1 >> 4) | REG1) & static_cast(0x00FF); + REG2 = ((REG2 >> 4) | REG2) & static_cast(0x00FF); + + REG1 = ((REG1 >> 8) | REG1) & static_cast(0xFFFF); + REG2 = ((REG2 >> 8) | REG2) & static_cast(0xFFFF); + + return glm::u8vec2(REG1, REG2); + } + + GLM_FUNC_QUALIFIER int32 bitfieldInterleave(int16 x, int16 y) + { + union sign16 + { + int16 i; + uint16 u; + } sign_x, sign_y; + + union sign32 + { + int32 i; + uint32 u; + } result; + + sign_x.i = x; + sign_y.i = y; + result.u = bitfieldInterleave(sign_x.u, sign_y.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint16 x, uint16 y) + { + return detail::bitfieldInterleave(x, y); + } + + GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(u16vec2 const& v) + { + return detail::bitfieldInterleave(v.x, v.y); + } + + GLM_FUNC_QUALIFIER glm::u16vec2 bitfieldDeinterleave(glm::uint32 x) + { + glm::uint32 REG1(x); + glm::uint32 REG2(x >>= 1); + + REG1 = REG1 & static_cast(0x55555555); + REG2 = REG2 & static_cast(0x55555555); + + REG1 = ((REG1 >> 1) | REG1) & static_cast(0x33333333); + REG2 = ((REG2 >> 1) | REG2) & static_cast(0x33333333); + + REG1 = ((REG1 >> 2) | REG1) & static_cast(0x0F0F0F0F); + REG2 = ((REG2 >> 2) | REG2) & static_cast(0x0F0F0F0F); + + REG1 = ((REG1 >> 4) | REG1) & static_cast(0x00FF00FF); + REG2 = ((REG2 >> 4) | REG2) & static_cast(0x00FF00FF); + + REG1 = ((REG1 >> 8) | REG1) & static_cast(0x0000FFFF); + REG2 = ((REG2 >> 8) | REG2) & static_cast(0x0000FFFF); + + return glm::u16vec2(REG1, REG2); + } + + GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int32 x, int32 y) + { + union sign32 + { + int32 i; + uint32 u; + } sign_x, sign_y; + + union sign64 + { + int64 i; + uint64 u; + } result; + + sign_x.i = x; + sign_y.i = y; + result.u = bitfieldInterleave(sign_x.u, sign_y.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint32 x, uint32 y) + { + return detail::bitfieldInterleave(x, y); + } + + GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(u32vec2 const& v) + { + return detail::bitfieldInterleave(v.x, v.y); + } + + GLM_FUNC_QUALIFIER glm::u32vec2 bitfieldDeinterleave(glm::uint64 x) + { + glm::uint64 REG1(x); + glm::uint64 REG2(x >>= 1); + + REG1 = REG1 & static_cast(0x5555555555555555ull); + REG2 = REG2 & static_cast(0x5555555555555555ull); + + REG1 = ((REG1 >> 1) | REG1) & static_cast(0x3333333333333333ull); + REG2 = ((REG2 >> 1) | REG2) & static_cast(0x3333333333333333ull); + + REG1 = ((REG1 >> 2) | REG1) & static_cast(0x0F0F0F0F0F0F0F0Full); + REG2 = ((REG2 >> 2) | REG2) & static_cast(0x0F0F0F0F0F0F0F0Full); + + REG1 = ((REG1 >> 4) | REG1) & static_cast(0x00FF00FF00FF00FFull); + REG2 = ((REG2 >> 4) | REG2) & static_cast(0x00FF00FF00FF00FFull); + + REG1 = ((REG1 >> 8) | REG1) & static_cast(0x0000FFFF0000FFFFull); + REG2 = ((REG2 >> 8) | REG2) & static_cast(0x0000FFFF0000FFFFull); + + REG1 = ((REG1 >> 16) | REG1) & static_cast(0x00000000FFFFFFFFull); + REG2 = ((REG2 >> 16) | REG2) & static_cast(0x00000000FFFFFFFFull); + + return glm::u32vec2(REG1, REG2); + } + + GLM_FUNC_QUALIFIER int32 bitfieldInterleave(int8 x, int8 y, int8 z) + { + union sign8 + { + int8 i; + uint8 u; + } sign_x, sign_y, sign_z; + + union sign32 + { + int32 i; + uint32 u; + } result; + + sign_x.i = x; + sign_y.i = y; + sign_z.i = z; + result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z) + { + return detail::bitfieldInterleave(x, y, z); + } + + GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(u8vec3 const& v) + { + return detail::bitfieldInterleave(v.x, v.y, v.z); + } + + GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int16 x, int16 y, int16 z) + { + union sign16 + { + int16 i; + uint16 u; + } sign_x, sign_y, sign_z; + + union sign64 + { + int64 i; + uint64 u; + } result; + + sign_x.i = x; + sign_y.i = y; + sign_z.i = z; + result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z) + { + return detail::bitfieldInterleave(x, y, z); + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(u16vec3 const& v) + { + return detail::bitfieldInterleave(v.x, v.y, v.z); + } + + GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int32 x, int32 y, int32 z) + { + union sign16 + { + int32 i; + uint32 u; + } sign_x, sign_y, sign_z; + + union sign64 + { + int64 i; + uint64 u; + } result; + + sign_x.i = x; + sign_y.i = y; + sign_z.i = z; + result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z) + { + return detail::bitfieldInterleave(x, y, z); + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(u32vec3 const& v) + { + return detail::bitfieldInterleave(v.x, v.y, v.z); + } + + GLM_FUNC_QUALIFIER int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w) + { + union sign8 + { + int8 i; + uint8 u; + } sign_x, sign_y, sign_z, sign_w; + + union sign32 + { + int32 i; + uint32 u; + } result; + + sign_x.i = x; + sign_y.i = y; + sign_z.i = z; + sign_w.i = w; + result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u, sign_w.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w) + { + return detail::bitfieldInterleave(x, y, z, w); + } + + GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(u8vec4 const& v) + { + return detail::bitfieldInterleave(v.x, v.y, v.z, v.w); + } + + GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int16 x, int16 y, int16 z, int16 w) + { + union sign16 + { + int16 i; + uint16 u; + } sign_x, sign_y, sign_z, sign_w; + + union sign64 + { + int64 i; + uint64 u; + } result; + + sign_x.i = x; + sign_y.i = y; + sign_z.i = z; + sign_w.i = w; + result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u, sign_w.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w) + { + return detail::bitfieldInterleave(x, y, z, w); + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(u16vec4 const& v) + { + return detail::bitfieldInterleave(v.x, v.y, v.z, v.w); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/color_space.hpp b/NothinFancy/dep/include/glm/gtc/color_space.hpp new file mode 100644 index 0000000..cffd9f0 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/color_space.hpp @@ -0,0 +1,56 @@ +/// @ref gtc_color_space +/// @file glm/gtc/color_space.hpp +/// +/// @see core (dependence) +/// @see gtc_color_space (dependence) +/// +/// @defgroup gtc_color_space GLM_GTC_color_space +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../exponential.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_color_space extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_color_space + /// @{ + + /// Convert a linear color to sRGB color using a standard gamma correction. + /// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template + GLM_FUNC_DECL vec convertLinearToSRGB(vec const& ColorLinear); + + /// Convert a linear color to sRGB color using a custom gamma correction. + /// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template + GLM_FUNC_DECL vec convertLinearToSRGB(vec const& ColorLinear, T Gamma); + + /// Convert a sRGB color to linear color using a standard gamma correction. + /// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template + GLM_FUNC_DECL vec convertSRGBToLinear(vec const& ColorSRGB); + + /// Convert a sRGB color to linear color using a custom gamma correction. + // IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template + GLM_FUNC_DECL vec convertSRGBToLinear(vec const& ColorSRGB, T Gamma); + + /// @} +} //namespace glm + +#include "color_space.inl" diff --git a/NothinFancy/dep/include/glm/gtc/color_space.inl b/NothinFancy/dep/include/glm/gtc/color_space.inl new file mode 100644 index 0000000..2a90004 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/color_space.inl @@ -0,0 +1,84 @@ +/// @ref gtc_color_space + +namespace glm{ +namespace detail +{ + template + struct compute_rgbToSrgb + { + GLM_FUNC_QUALIFIER static vec call(vec const& ColorRGB, T GammaCorrection) + { + vec const ClampedColor(clamp(ColorRGB, static_cast(0), static_cast(1))); + + return mix( + pow(ClampedColor, vec(GammaCorrection)) * static_cast(1.055) - static_cast(0.055), + ClampedColor * static_cast(12.92), + lessThan(ClampedColor, vec(static_cast(0.0031308)))); + } + }; + + template + struct compute_rgbToSrgb<4, T, Q> + { + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& ColorRGB, T GammaCorrection) + { + return vec<4, T, Q>(compute_rgbToSrgb<3, T, Q>::call(vec<3, T, Q>(ColorRGB), GammaCorrection), ColorRGB.w); + } + }; + + template + struct compute_srgbToRgb + { + GLM_FUNC_QUALIFIER static vec call(vec const& ColorSRGB, T Gamma) + { + return mix( + pow((ColorSRGB + static_cast(0.055)) * static_cast(0.94786729857819905213270142180095), vec(Gamma)), + ColorSRGB * static_cast(0.07739938080495356037151702786378), + lessThanEqual(ColorSRGB, vec(static_cast(0.04045)))); + } + }; + + template + struct compute_srgbToRgb<4, T, Q> + { + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& ColorSRGB, T Gamma) + { + return vec<4, T, Q>(compute_srgbToRgb<3, T, Q>::call(vec<3, T, Q>(ColorSRGB), Gamma), ColorSRGB.w); + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER vec convertLinearToSRGB(vec const& ColorLinear) + { + return detail::compute_rgbToSrgb::call(ColorLinear, static_cast(0.41666)); + } + + // Based on Ian Taylor http://chilliant.blogspot.fr/2012/08/srgb-approximations-for-hlsl.html + template<> + GLM_FUNC_QUALIFIER vec<3, float, lowp> convertLinearToSRGB(vec<3, float, lowp> const& ColorLinear) + { + vec<3, float, lowp> S1 = sqrt(ColorLinear); + vec<3, float, lowp> S2 = sqrt(S1); + vec<3, float, lowp> S3 = sqrt(S2); + return 0.662002687f * S1 + 0.684122060f * S2 - 0.323583601f * S3 - 0.0225411470f * ColorLinear; + } + + template + GLM_FUNC_QUALIFIER vec convertLinearToSRGB(vec const& ColorLinear, T Gamma) + { + return detail::compute_rgbToSrgb::call(ColorLinear, static_cast(1) / Gamma); + } + + template + GLM_FUNC_QUALIFIER vec convertSRGBToLinear(vec const& ColorSRGB) + { + return detail::compute_srgbToRgb::call(ColorSRGB, static_cast(2.4)); + } + + template + GLM_FUNC_QUALIFIER vec convertSRGBToLinear(vec const& ColorSRGB, T Gamma) + { + return detail::compute_srgbToRgb::call(ColorSRGB, Gamma); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/constants.hpp b/NothinFancy/dep/include/glm/gtc/constants.hpp new file mode 100644 index 0000000..99f2128 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/constants.hpp @@ -0,0 +1,165 @@ +/// @ref gtc_constants +/// @file glm/gtc/constants.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_constants GLM_GTC_constants +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Provide a list of constants and precomputed useful values. + +#pragma once + +// Dependencies +#include "../ext/scalar_constants.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_constants extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_constants + /// @{ + + /// Return 0. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType zero(); + + /// Return 1. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType one(); + + /// Return pi * 2. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType two_pi(); + + /// Return square root of pi. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_pi(); + + /// Return pi / 2. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType half_pi(); + + /// Return pi / 2 * 3. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType three_over_two_pi(); + + /// Return pi / 4. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType quarter_pi(); + + /// Return 1 / pi. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_pi(); + + /// Return 1 / (pi * 2). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_two_pi(); + + /// Return 2 / pi. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_pi(); + + /// Return 4 / pi. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType four_over_pi(); + + /// Return 2 / sqrt(pi). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_root_pi(); + + /// Return 1 / sqrt(2). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_root_two(); + + /// Return sqrt(pi / 2). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_half_pi(); + + /// Return sqrt(2 * pi). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_two_pi(); + + /// Return sqrt(ln(4)). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_ln_four(); + + /// Return e constant. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType e(); + + /// Return Euler's constant. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType euler(); + + /// Return sqrt(2). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_two(); + + /// Return sqrt(3). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_three(); + + /// Return sqrt(5). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_five(); + + /// Return ln(2). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType ln_two(); + + /// Return ln(10). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ten(); + + /// Return ln(ln(2)). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ln_two(); + + /// Return 1 / 3. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType third(); + + /// Return 2 / 3. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType two_thirds(); + + /// Return the golden ratio constant. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType golden_ratio(); + + /// @} +} //namespace glm + +#include "constants.inl" diff --git a/NothinFancy/dep/include/glm/gtc/constants.inl b/NothinFancy/dep/include/glm/gtc/constants.inl new file mode 100644 index 0000000..bb98c6b --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/constants.inl @@ -0,0 +1,167 @@ +/// @ref gtc_constants + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType zero() + { + return genType(0); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one() + { + return genType(1); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_pi() + { + return genType(6.28318530717958647692528676655900576); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_pi() + { + return genType(1.772453850905516027); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType half_pi() + { + return genType(1.57079632679489661923132169163975144); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType three_over_two_pi() + { + return genType(4.71238898038468985769396507491925432); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType quarter_pi() + { + return genType(0.785398163397448309615660845819875721); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_pi() + { + return genType(0.318309886183790671537767526745028724); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_two_pi() + { + return genType(0.159154943091895335768883763372514362); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_pi() + { + return genType(0.636619772367581343075535053490057448); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType four_over_pi() + { + return genType(1.273239544735162686151070106980114898); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_root_pi() + { + return genType(1.12837916709551257389615890312154517); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_root_two() + { + return genType(0.707106781186547524400844362104849039); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_half_pi() + { + return genType(1.253314137315500251); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two_pi() + { + return genType(2.506628274631000502); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_ln_four() + { + return genType(1.17741002251547469); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType e() + { + return genType(2.71828182845904523536); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType euler() + { + return genType(0.577215664901532860606); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two() + { + return genType(1.41421356237309504880168872420969808); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_three() + { + return genType(1.73205080756887729352744634150587236); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_five() + { + return genType(2.23606797749978969640917366873127623); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_two() + { + return genType(0.693147180559945309417232121458176568); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ten() + { + return genType(2.30258509299404568401799145468436421); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ln_two() + { + return genType(-0.3665129205816643); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType third() + { + return genType(0.3333333333333333333333333333333333333333); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_thirds() + { + return genType(0.666666666666666666666666666666666666667); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType golden_ratio() + { + return genType(1.61803398874989484820458683436563811); + } + +} //namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/epsilon.hpp b/NothinFancy/dep/include/glm/gtc/epsilon.hpp new file mode 100644 index 0000000..640439b --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/epsilon.hpp @@ -0,0 +1,60 @@ +/// @ref gtc_epsilon +/// @file glm/gtc/epsilon.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtc_epsilon GLM_GTC_epsilon +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Comparison functions for a user defined epsilon values. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_epsilon extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_epsilon + /// @{ + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL vec epsilonEqual(vec const& x, vec const& y, T const& epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL bool epsilonEqual(genType const& x, genType const& y, genType const& epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is not satisfied. + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL vec epsilonNotEqual(vec const& x, vec const& y, T const& epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL bool epsilonNotEqual(genType const& x, genType const& y, genType const& epsilon); + + /// @} +}//namespace glm + +#include "epsilon.inl" diff --git a/NothinFancy/dep/include/glm/gtc/epsilon.inl b/NothinFancy/dep/include/glm/gtc/epsilon.inl new file mode 100644 index 0000000..508b9f8 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/epsilon.inl @@ -0,0 +1,80 @@ +/// @ref gtc_epsilon + +// Dependency: +#include "../vector_relational.hpp" +#include "../common.hpp" + +namespace glm +{ + template<> + GLM_FUNC_QUALIFIER bool epsilonEqual + ( + float const& x, + float const& y, + float const& epsilon + ) + { + return abs(x - y) < epsilon; + } + + template<> + GLM_FUNC_QUALIFIER bool epsilonEqual + ( + double const& x, + double const& y, + double const& epsilon + ) + { + return abs(x - y) < epsilon; + } + + template + GLM_FUNC_QUALIFIER vec epsilonEqual(vec const& x, vec const& y, T const& epsilon) + { + return lessThan(abs(x - y), vec(epsilon)); + } + + template + GLM_FUNC_QUALIFIER vec epsilonEqual(vec const& x, vec const& y, vec const& epsilon) + { + return lessThan(abs(x - y), vec(epsilon)); + } + + template<> + GLM_FUNC_QUALIFIER bool epsilonNotEqual(float const& x, float const& y, float const& epsilon) + { + return abs(x - y) >= epsilon; + } + + template<> + GLM_FUNC_QUALIFIER bool epsilonNotEqual(double const& x, double const& y, double const& epsilon) + { + return abs(x - y) >= epsilon; + } + + template + GLM_FUNC_QUALIFIER vec epsilonNotEqual(vec const& x, vec const& y, T const& epsilon) + { + return greaterThanEqual(abs(x - y), vec(epsilon)); + } + + template + GLM_FUNC_QUALIFIER vec epsilonNotEqual(vec const& x, vec const& y, vec const& epsilon) + { + return greaterThanEqual(abs(x - y), vec(epsilon)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> epsilonEqual(qua const& x, qua const& y, T const& epsilon) + { + vec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); + return lessThan(abs(v), vec<4, T, Q>(epsilon)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> epsilonNotEqual(qua const& x, qua const& y, T const& epsilon) + { + vec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); + return greaterThanEqual(abs(v), vec<4, T, Q>(epsilon)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/integer.hpp b/NothinFancy/dep/include/glm/gtc/integer.hpp new file mode 100644 index 0000000..64ce10b --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/integer.hpp @@ -0,0 +1,65 @@ +/// @ref gtc_integer +/// @file glm/gtc/integer.hpp +/// +/// @see core (dependence) +/// @see gtc_integer (dependence) +/// +/// @defgroup gtc_integer GLM_GTC_integer +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// @brief Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../common.hpp" +#include "../integer.hpp" +#include "../exponential.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_integer extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_integer + /// @{ + + /// Returns the log2 of x for integer values. Usefull to compute mipmap count from the texture size. + /// @see gtc_integer + template + GLM_FUNC_DECL genIUType log2(genIUType x); + + /// Returns a value equal to the nearest integer to x. + /// The fraction 0.5 will round in a direction chosen by the + /// implementation, presumably the direction that is fastest. + /// + /// @param x The values of the argument must be greater or equal to zero. + /// @tparam T floating point scalar types. + /// + /// @see GLSL round man page + /// @see gtc_integer + template + GLM_FUNC_DECL vec iround(vec const& x); + + /// Returns a value equal to the nearest integer to x. + /// The fraction 0.5 will round in a direction chosen by the + /// implementation, presumably the direction that is fastest. + /// + /// @param x The values of the argument must be greater or equal to zero. + /// @tparam T floating point scalar types. + /// + /// @see GLSL round man page + /// @see gtc_integer + template + GLM_FUNC_DECL vec uround(vec const& x); + + /// @} +} //namespace glm + +#include "integer.inl" diff --git a/NothinFancy/dep/include/glm/gtc/integer.inl b/NothinFancy/dep/include/glm/gtc/integer.inl new file mode 100644 index 0000000..f0a8b4f --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/integer.inl @@ -0,0 +1,68 @@ +/// @ref gtc_integer + +namespace glm{ +namespace detail +{ + template + struct compute_log2 + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + //Equivalent to return findMSB(vec); but save one function call in ASM with VC + //return findMSB(vec); + return vec(detail::compute_findMSB_vec::call(v)); + } + }; + +# if GLM_HAS_BITSCAN_WINDOWS + template + struct compute_log2<4, int, Q, false, Aligned> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v) + { + vec<4, int, Q> Result; + _BitScanReverse(reinterpret_cast(&Result.x), v.x); + _BitScanReverse(reinterpret_cast(&Result.y), v.y); + _BitScanReverse(reinterpret_cast(&Result.z), v.z); + _BitScanReverse(reinterpret_cast(&Result.w), v.w); + return Result; + } + }; +# endif//GLM_HAS_BITSCAN_WINDOWS +}//namespace detail + template + GLM_FUNC_QUALIFIER int iround(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'iround' only accept floating-point inputs"); + assert(static_cast(0.0) <= x); + + return static_cast(x + static_cast(0.5)); + } + + template + GLM_FUNC_QUALIFIER vec iround(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'iround' only accept floating-point inputs"); + assert(all(lessThanEqual(vec(0), x))); + + return vec(x + static_cast(0.5)); + } + + template + GLM_FUNC_QUALIFIER uint uround(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'uround' only accept floating-point inputs"); + assert(static_cast(0.0) <= x); + + return static_cast(x + static_cast(0.5)); + } + + template + GLM_FUNC_QUALIFIER vec uround(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'uround' only accept floating-point inputs"); + assert(all(lessThanEqual(vec(0), x))); + + return vec(x + static_cast(0.5)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/matrix_access.hpp b/NothinFancy/dep/include/glm/gtc/matrix_access.hpp new file mode 100644 index 0000000..4935ba7 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/matrix_access.hpp @@ -0,0 +1,60 @@ +/// @ref gtc_matrix_access +/// @file glm/gtc/matrix_access.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_matrix_access GLM_GTC_matrix_access +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines functions to access rows or columns of a matrix easily. + +#pragma once + +// Dependency: +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_matrix_access extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_matrix_access + /// @{ + + /// Get a specific row of a matrix. + /// @see gtc_matrix_access + template + GLM_FUNC_DECL typename genType::row_type row( + genType const& m, + length_t index); + + /// Set a specific row to a matrix. + /// @see gtc_matrix_access + template + GLM_FUNC_DECL genType row( + genType const& m, + length_t index, + typename genType::row_type const& x); + + /// Get a specific column of a matrix. + /// @see gtc_matrix_access + template + GLM_FUNC_DECL typename genType::col_type column( + genType const& m, + length_t index); + + /// Set a specific column to a matrix. + /// @see gtc_matrix_access + template + GLM_FUNC_DECL genType column( + genType const& m, + length_t index, + typename genType::col_type const& x); + + /// @} +}//namespace glm + +#include "matrix_access.inl" diff --git a/NothinFancy/dep/include/glm/gtc/matrix_access.inl b/NothinFancy/dep/include/glm/gtc/matrix_access.inl new file mode 100644 index 0000000..09fcc10 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/matrix_access.inl @@ -0,0 +1,62 @@ +/// @ref gtc_matrix_access + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType row + ( + genType const& m, + length_t index, + typename genType::row_type const& x + ) + { + assert(index >= 0 && index < m[0].length()); + + genType Result = m; + for(length_t i = 0; i < m.length(); ++i) + Result[i][index] = x[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER typename genType::row_type row + ( + genType const& m, + length_t index + ) + { + assert(index >= 0 && index < m[0].length()); + + typename genType::row_type Result(0); + for(length_t i = 0; i < m.length(); ++i) + Result[i] = m[i][index]; + return Result; + } + + template + GLM_FUNC_QUALIFIER genType column + ( + genType const& m, + length_t index, + typename genType::col_type const& x + ) + { + assert(index >= 0 && index < m.length()); + + genType Result = m; + Result[index] = x; + return Result; + } + + template + GLM_FUNC_QUALIFIER typename genType::col_type column + ( + genType const& m, + length_t index + ) + { + assert(index >= 0 && index < m.length()); + + return m[index]; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/matrix_integer.hpp b/NothinFancy/dep/include/glm/gtc/matrix_integer.hpp new file mode 100644 index 0000000..d7ebdc7 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/matrix_integer.hpp @@ -0,0 +1,433 @@ +/// @ref gtc_matrix_integer +/// @file glm/gtc/matrix_integer.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_matrix_integer GLM_GTC_matrix_integer +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x2.hpp" +#include "../mat2x3.hpp" +#include "../mat2x4.hpp" +#include "../mat3x2.hpp" +#include "../mat3x3.hpp" +#include "../mat3x4.hpp" +#include "../mat4x2.hpp" +#include "../mat4x3.hpp" +#include "../mat4x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_matrix_integer extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_matrix_integer + /// @{ + + /// High-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, highp> highp_imat2; + + /// High-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, highp> highp_imat3; + + /// High-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, highp> highp_imat4; + + /// High-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, highp> highp_imat2x2; + + /// High-qualifier signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, int, highp> highp_imat2x3; + + /// High-qualifier signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, int, highp> highp_imat2x4; + + /// High-qualifier signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, int, highp> highp_imat3x2; + + /// High-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, highp> highp_imat3x3; + + /// High-qualifier signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, int, highp> highp_imat3x4; + + /// High-qualifier signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, int, highp> highp_imat4x2; + + /// High-qualifier signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, int, highp> highp_imat4x3; + + /// High-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, highp> highp_imat4x4; + + + /// Medium-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, mediump> mediump_imat2; + + /// Medium-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, mediump> mediump_imat3; + + /// Medium-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, mediump> mediump_imat4; + + + /// Medium-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, mediump> mediump_imat2x2; + + /// Medium-qualifier signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, int, mediump> mediump_imat2x3; + + /// Medium-qualifier signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, int, mediump> mediump_imat2x4; + + /// Medium-qualifier signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, int, mediump> mediump_imat3x2; + + /// Medium-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, mediump> mediump_imat3x3; + + /// Medium-qualifier signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, int, mediump> mediump_imat3x4; + + /// Medium-qualifier signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, int, mediump> mediump_imat4x2; + + /// Medium-qualifier signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, int, mediump> mediump_imat4x3; + + /// Medium-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, mediump> mediump_imat4x4; + + + /// Low-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, lowp> lowp_imat2; + + /// Low-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, lowp> lowp_imat3; + + /// Low-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, lowp> lowp_imat4; + + + /// Low-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, lowp> lowp_imat2x2; + + /// Low-qualifier signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, int, lowp> lowp_imat2x3; + + /// Low-qualifier signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, int, lowp> lowp_imat2x4; + + /// Low-qualifier signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, int, lowp> lowp_imat3x2; + + /// Low-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, lowp> lowp_imat3x3; + + /// Low-qualifier signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, int, lowp> lowp_imat3x4; + + /// Low-qualifier signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, int, lowp> lowp_imat4x2; + + /// Low-qualifier signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, int, lowp> lowp_imat4x3; + + /// Low-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, lowp> lowp_imat4x4; + + + /// High-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, highp> highp_umat2; + + /// High-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, highp> highp_umat3; + + /// High-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, highp> highp_umat4; + + /// High-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, highp> highp_umat2x2; + + /// High-qualifier unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, uint, highp> highp_umat2x3; + + /// High-qualifier unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, uint, highp> highp_umat2x4; + + /// High-qualifier unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, uint, highp> highp_umat3x2; + + /// High-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, highp> highp_umat3x3; + + /// High-qualifier unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, uint, highp> highp_umat3x4; + + /// High-qualifier unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, uint, highp> highp_umat4x2; + + /// High-qualifier unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, uint, highp> highp_umat4x3; + + /// High-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, highp> highp_umat4x4; + + + /// Medium-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, mediump> mediump_umat2; + + /// Medium-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, mediump> mediump_umat3; + + /// Medium-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, mediump> mediump_umat4; + + + /// Medium-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, mediump> mediump_umat2x2; + + /// Medium-qualifier unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, uint, mediump> mediump_umat2x3; + + /// Medium-qualifier unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, uint, mediump> mediump_umat2x4; + + /// Medium-qualifier unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, uint, mediump> mediump_umat3x2; + + /// Medium-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, mediump> mediump_umat3x3; + + /// Medium-qualifier unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, uint, mediump> mediump_umat3x4; + + /// Medium-qualifier unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, uint, mediump> mediump_umat4x2; + + /// Medium-qualifier unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, uint, mediump> mediump_umat4x3; + + /// Medium-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, mediump> mediump_umat4x4; + + + /// Low-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, lowp> lowp_umat2; + + /// Low-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, lowp> lowp_umat3; + + /// Low-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, lowp> lowp_umat4; + + + /// Low-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, lowp> lowp_umat2x2; + + /// Low-qualifier unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, uint, lowp> lowp_umat2x3; + + /// Low-qualifier unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, uint, lowp> lowp_umat2x4; + + /// Low-qualifier unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, uint, lowp> lowp_umat3x2; + + /// Low-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, lowp> lowp_umat3x3; + + /// Low-qualifier unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, uint, lowp> lowp_umat3x4; + + /// Low-qualifier unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, uint, lowp> lowp_umat4x2; + + /// Low-qualifier unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, uint, lowp> lowp_umat4x3; + + /// Low-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, lowp> lowp_umat4x4; + + + + /// Signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, defaultp> imat2; + + /// Signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, defaultp> imat3; + + /// Signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, defaultp> imat4; + + /// Signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, defaultp> imat2x2; + + /// Signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, int, defaultp> imat2x3; + + /// Signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, int, defaultp> imat2x4; + + /// Signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, int, defaultp> imat3x2; + + /// Signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, defaultp> imat3x3; + + /// Signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, int, defaultp> imat3x4; + + /// Signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, int, defaultp> imat4x2; + + /// Signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, int, defaultp> imat4x3; + + /// Signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, defaultp> imat4x4; + + + + /// Unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, defaultp> umat2; + + /// Unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, defaultp> umat3; + + /// Unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, defaultp> umat4; + + /// Unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, defaultp> umat2x2; + + /// Unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, uint, defaultp> umat2x3; + + /// Unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, uint, defaultp> umat2x4; + + /// Unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, uint, defaultp> umat3x2; + + /// Unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, defaultp> umat3x3; + + /// Unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, uint, defaultp> umat3x4; + + /// Unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, uint, defaultp> umat4x2; + + /// Unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, uint, defaultp> umat4x3; + + /// Unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, defaultp> umat4x4; + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/matrix_inverse.hpp b/NothinFancy/dep/include/glm/gtc/matrix_inverse.hpp new file mode 100644 index 0000000..a1900ad --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/matrix_inverse.hpp @@ -0,0 +1,50 @@ +/// @ref gtc_matrix_inverse +/// @file glm/gtc/matrix_inverse.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_matrix_inverse GLM_GTC_matrix_inverse +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines additional matrix inverting functions. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../matrix.hpp" +#include "../mat2x2.hpp" +#include "../mat3x3.hpp" +#include "../mat4x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_matrix_inverse extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_matrix_inverse + /// @{ + + /// Fast matrix inverse for affine matrix. + /// + /// @param m Input matrix to invert. + /// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-qualifier floating point value is highly innacurate. + /// @see gtc_matrix_inverse + template + GLM_FUNC_DECL genType affineInverse(genType const& m); + + /// Compute the inverse transpose of a matrix. + /// + /// @param m Input matrix to invert transpose. + /// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-qualifier floating point value is highly innacurate. + /// @see gtc_matrix_inverse + template + GLM_FUNC_DECL genType inverseTranspose(genType const& m); + + /// @} +}//namespace glm + +#include "matrix_inverse.inl" diff --git a/NothinFancy/dep/include/glm/gtc/matrix_inverse.inl b/NothinFancy/dep/include/glm/gtc/matrix_inverse.inl new file mode 100644 index 0000000..c004b9e --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/matrix_inverse.inl @@ -0,0 +1,118 @@ +/// @ref gtc_matrix_inverse + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> affineInverse(mat<3, 3, T, Q> const& m) + { + mat<2, 2, T, Q> const Inv(inverse(mat<2, 2, T, Q>(m))); + + return mat<3, 3, T, Q>( + vec<3, T, Q>(Inv[0], static_cast(0)), + vec<3, T, Q>(Inv[1], static_cast(0)), + vec<3, T, Q>(-Inv * vec<2, T, Q>(m[2]), static_cast(1))); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> affineInverse(mat<4, 4, T, Q> const& m) + { + mat<3, 3, T, Q> const Inv(inverse(mat<3, 3, T, Q>(m))); + + return mat<4, 4, T, Q>( + vec<4, T, Q>(Inv[0], static_cast(0)), + vec<4, T, Q>(Inv[1], static_cast(0)), + vec<4, T, Q>(Inv[2], static_cast(0)), + vec<4, T, Q>(-Inv * vec<3, T, Q>(m[3]), static_cast(1))); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> inverseTranspose(mat<2, 2, T, Q> const& m) + { + T Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1]; + + mat<2, 2, T, Q> Inverse( + + m[1][1] / Determinant, + - m[0][1] / Determinant, + - m[1][0] / Determinant, + + m[0][0] / Determinant); + + return Inverse; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> inverseTranspose(mat<3, 3, T, Q> const& m) + { + T Determinant = + + m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) + - m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]) + + m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); + + mat<3, 3, T, Q> Inverse; + Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]); + Inverse[0][1] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]); + Inverse[0][2] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]); + Inverse[1][0] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]); + Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]); + Inverse[1][2] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]); + Inverse[2][0] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + Inverse[2][1] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]); + Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]); + Inverse /= Determinant; + + return Inverse; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> inverseTranspose(mat<4, 4, T, Q> const& m) + { + T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + T SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + T SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + T SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + T SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + T SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + T SubFactor11 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + T SubFactor12 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + T SubFactor13 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + T SubFactor14 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + T SubFactor15 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + T SubFactor16 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + T SubFactor17 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + mat<4, 4, T, Q> Inverse; + Inverse[0][0] = + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02); + Inverse[0][1] = - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04); + Inverse[0][2] = + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05); + Inverse[0][3] = - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05); + + Inverse[1][0] = - (m[0][1] * SubFactor00 - m[0][2] * SubFactor01 + m[0][3] * SubFactor02); + Inverse[1][1] = + (m[0][0] * SubFactor00 - m[0][2] * SubFactor03 + m[0][3] * SubFactor04); + Inverse[1][2] = - (m[0][0] * SubFactor01 - m[0][1] * SubFactor03 + m[0][3] * SubFactor05); + Inverse[1][3] = + (m[0][0] * SubFactor02 - m[0][1] * SubFactor04 + m[0][2] * SubFactor05); + + Inverse[2][0] = + (m[0][1] * SubFactor06 - m[0][2] * SubFactor07 + m[0][3] * SubFactor08); + Inverse[2][1] = - (m[0][0] * SubFactor06 - m[0][2] * SubFactor09 + m[0][3] * SubFactor10); + Inverse[2][2] = + (m[0][0] * SubFactor07 - m[0][1] * SubFactor09 + m[0][3] * SubFactor11); + Inverse[2][3] = - (m[0][0] * SubFactor08 - m[0][1] * SubFactor10 + m[0][2] * SubFactor11); + + Inverse[3][0] = - (m[0][1] * SubFactor12 - m[0][2] * SubFactor13 + m[0][3] * SubFactor14); + Inverse[3][1] = + (m[0][0] * SubFactor12 - m[0][2] * SubFactor15 + m[0][3] * SubFactor16); + Inverse[3][2] = - (m[0][0] * SubFactor13 - m[0][1] * SubFactor15 + m[0][3] * SubFactor17); + Inverse[3][3] = + (m[0][0] * SubFactor14 - m[0][1] * SubFactor16 + m[0][2] * SubFactor17); + + T Determinant = + + m[0][0] * Inverse[0][0] + + m[0][1] * Inverse[0][1] + + m[0][2] * Inverse[0][2] + + m[0][3] * Inverse[0][3]; + + Inverse /= Determinant; + + return Inverse; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/matrix_transform.hpp b/NothinFancy/dep/include/glm/gtc/matrix_transform.hpp new file mode 100644 index 0000000..612418f --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/matrix_transform.hpp @@ -0,0 +1,36 @@ +/// @ref gtc_matrix_transform +/// @file glm/gtc/matrix_transform.hpp +/// +/// @see core (dependence) +/// @see gtx_transform +/// @see gtx_transform2 +/// +/// @defgroup gtc_matrix_transform GLM_GTC_matrix_transform +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines functions that generate common transformation matrices. +/// +/// The matrices generated by this extension use standard OpenGL fixed-function +/// conventions. For example, the lookAt function generates a transform from world +/// space into the specific eye space that the projective matrix functions +/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility +/// specifications defines the particular layout of this eye space. + +#pragma once + +// Dependencies +#include "../mat4x4.hpp" +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../ext/matrix_projection.hpp" +#include "../ext/matrix_clip_space.hpp" +#include "../ext/matrix_transform.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_matrix_transform extension included") +#endif + +#include "matrix_transform.inl" diff --git a/NothinFancy/dep/include/glm/gtc/matrix_transform.inl b/NothinFancy/dep/include/glm/gtc/matrix_transform.inl new file mode 100644 index 0000000..15b46bc --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/matrix_transform.inl @@ -0,0 +1,3 @@ +#include "../geometric.hpp" +#include "../trigonometric.hpp" +#include "../matrix.hpp" diff --git a/NothinFancy/dep/include/glm/gtc/noise.hpp b/NothinFancy/dep/include/glm/gtc/noise.hpp new file mode 100644 index 0000000..ab1772e --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/noise.hpp @@ -0,0 +1,61 @@ +/// @ref gtc_noise +/// @file glm/gtc/noise.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_noise GLM_GTC_noise +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines 2D, 3D and 4D procedural noise functions +/// Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": +/// https://github.com/ashima/webgl-noise +/// Following Stefan Gustavson's paper "Simplex noise demystified": +/// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_noise.hpp" +#include "../geometric.hpp" +#include "../common.hpp" +#include "../vector_relational.hpp" +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_noise extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_noise + /// @{ + + /// Classic perlin noise. + /// @see gtc_noise + template + GLM_FUNC_DECL T perlin( + vec const& p); + + /// Periodic perlin noise. + /// @see gtc_noise + template + GLM_FUNC_DECL T perlin( + vec const& p, + vec const& rep); + + /// Simplex noise. + /// @see gtc_noise + template + GLM_FUNC_DECL T simplex( + vec const& p); + + /// @} +}//namespace glm + +#include "noise.inl" diff --git a/NothinFancy/dep/include/glm/gtc/noise.inl b/NothinFancy/dep/include/glm/gtc/noise.inl new file mode 100644 index 0000000..30d0b27 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/noise.inl @@ -0,0 +1,807 @@ +/// @ref gtc_noise +/// +// Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": +// https://github.com/ashima/webgl-noise +// Following Stefan Gustavson's paper "Simplex noise demystified": +// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf + +namespace glm{ +namespace gtc +{ + template + GLM_FUNC_QUALIFIER vec<4, T, Q> grad4(T const& j, vec<4, T, Q> const& ip) + { + vec<3, T, Q> pXYZ = floor(fract(vec<3, T, Q>(j) * vec<3, T, Q>(ip)) * T(7)) * ip[2] - T(1); + T pW = static_cast(1.5) - dot(abs(pXYZ), vec<3, T, Q>(1)); + vec<4, T, Q> s = vec<4, T, Q>(lessThan(vec<4, T, Q>(pXYZ, pW), vec<4, T, Q>(0.0))); + pXYZ = pXYZ + (vec<3, T, Q>(s) * T(2) - T(1)) * s.w; + return vec<4, T, Q>(pXYZ, pW); + } +}//namespace gtc + + // Classic Perlin noise + template + GLM_FUNC_QUALIFIER T perlin(vec<2, T, Q> const& Position) + { + vec<4, T, Q> Pi = glm::floor(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) + vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + vec<4, T, Q> Pf = glm::fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + Pi = mod(Pi, vec<4, T, Q>(289)); // To avoid truncation effects in permutation + vec<4, T, Q> ix(Pi.x, Pi.z, Pi.x, Pi.z); + vec<4, T, Q> iy(Pi.y, Pi.y, Pi.w, Pi.w); + vec<4, T, Q> fx(Pf.x, Pf.z, Pf.x, Pf.z); + vec<4, T, Q> fy(Pf.y, Pf.y, Pf.w, Pf.w); + + vec<4, T, Q> i = detail::permute(detail::permute(ix) + iy); + + vec<4, T, Q> gx = static_cast(2) * glm::fract(i / T(41)) - T(1); + vec<4, T, Q> gy = glm::abs(gx) - T(0.5); + vec<4, T, Q> tx = glm::floor(gx + T(0.5)); + gx = gx - tx; + + vec<2, T, Q> g00(gx.x, gy.x); + vec<2, T, Q> g10(gx.y, gy.y); + vec<2, T, Q> g01(gx.z, gy.z); + vec<2, T, Q> g11(gx.w, gy.w); + + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); + g00 *= norm.x; + g01 *= norm.y; + g10 *= norm.z; + g11 *= norm.w; + + T n00 = dot(g00, vec<2, T, Q>(fx.x, fy.x)); + T n10 = dot(g10, vec<2, T, Q>(fx.y, fy.y)); + T n01 = dot(g01, vec<2, T, Q>(fx.z, fy.z)); + T n11 = dot(g11, vec<2, T, Q>(fx.w, fy.w)); + + vec<2, T, Q> fade_xy = detail::fade(vec<2, T, Q>(Pf.x, Pf.y)); + vec<2, T, Q> n_x = mix(vec<2, T, Q>(n00, n01), vec<2, T, Q>(n10, n11), fade_xy.x); + T n_xy = mix(n_x.x, n_x.y, fade_xy.y); + return T(2.3) * n_xy; + } + + // Classic Perlin noise + template + GLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& Position) + { + vec<3, T, Q> Pi0 = floor(Position); // Integer part for indexing + vec<3, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1 + Pi0 = detail::mod289(Pi0); + Pi1 = detail::mod289(Pi1); + vec<3, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<3, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy = vec<4, T, Q>(vec<2, T, Q>(Pi0.y), vec<2, T, Q>(Pi1.y)); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + + vec<4, T, Q> gx0 = ixy0 * T(1.0 / 7.0); + vec<4, T, Q> gy0 = fract(floor(gx0) * T(1.0 / 7.0)) - T(0.5); + gx0 = fract(gx0); + vec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0); + vec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0.0)); + gx0 -= sz0 * (step(T(0), gx0) - T(0.5)); + gy0 -= sz0 * (step(T(0), gy0) - T(0.5)); + + vec<4, T, Q> gx1 = ixy1 * T(1.0 / 7.0); + vec<4, T, Q> gy1 = fract(floor(gx1) * T(1.0 / 7.0)) - T(0.5); + gx1 = fract(gx1); + vec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1); + vec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(0.0)); + gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); + gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); + + vec<3, T, Q> g000(gx0.x, gy0.x, gz0.x); + vec<3, T, Q> g100(gx0.y, gy0.y, gz0.y); + vec<3, T, Q> g010(gx0.z, gy0.z, gz0.z); + vec<3, T, Q> g110(gx0.w, gy0.w, gz0.w); + vec<3, T, Q> g001(gx1.x, gy1.x, gz1.x); + vec<3, T, Q> g101(gx1.y, gy1.y, gz1.y); + vec<3, T, Q> g011(gx1.z, gy1.z, gz1.z); + vec<3, T, Q> g111(gx1.w, gy1.w, gz1.w); + + vec<4, T, Q> norm0 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + vec<4, T, Q> norm1 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + T n000 = dot(g000, Pf0); + T n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z)); + T n111 = dot(g111, Pf1); + + vec<3, T, Q> fade_xyz = detail::fade(Pf0); + vec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z); + vec<2, T, Q> n_yz = mix(vec<2, T, Q>(n_z.x, n_z.y), vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return T(2.2) * n_xyz; + } + /* + // Classic Perlin noise + template + GLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& P) + { + vec<3, T, Q> Pi0 = floor(P); // Integer part for indexing + vec<3, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1 + Pi0 = mod(Pi0, T(289)); + Pi1 = mod(Pi1, T(289)); + vec<3, T, Q> Pf0 = fract(P); // Fractional part for interpolation + vec<3, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + + vec<4, T, Q> ixy = permute(permute(ix) + iy); + vec<4, T, Q> ixy0 = permute(ixy + iz0); + vec<4, T, Q> ixy1 = permute(ixy + iz1); + + vec<4, T, Q> gx0 = ixy0 / T(7); + vec<4, T, Q> gy0 = fract(floor(gx0) / T(7)) - T(0.5); + gx0 = fract(gx0); + vec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0); + vec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0.0)); + gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); + gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); + + vec<4, T, Q> gx1 = ixy1 / T(7); + vec<4, T, Q> gy1 = fract(floor(gx1) / T(7)) - T(0.5); + gx1 = fract(gx1); + vec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1); + vec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(0.0)); + gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); + gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); + + vec<3, T, Q> g000(gx0.x, gy0.x, gz0.x); + vec<3, T, Q> g100(gx0.y, gy0.y, gz0.y); + vec<3, T, Q> g010(gx0.z, gy0.z, gz0.z); + vec<3, T, Q> g110(gx0.w, gy0.w, gz0.w); + vec<3, T, Q> g001(gx1.x, gy1.x, gz1.x); + vec<3, T, Q> g101(gx1.y, gy1.y, gz1.y); + vec<3, T, Q> g011(gx1.z, gy1.z, gz1.z); + vec<3, T, Q> g111(gx1.w, gy1.w, gz1.w); + + vec<4, T, Q> norm0 = taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + vec<4, T, Q> norm1 = taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + T n000 = dot(g000, Pf0); + T n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z)); + T n111 = dot(g111, Pf1); + + vec<3, T, Q> fade_xyz = fade(Pf0); + vec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z); + vec<2, T, Q> n_yz = mix( + vec<2, T, Q>(n_z.x, n_z.y), + vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return T(2.2) * n_xyz; + } + */ + // Classic Perlin noise + template + GLM_FUNC_QUALIFIER T perlin(vec<4, T, Q> const& Position) + { + vec<4, T, Q> Pi0 = floor(Position); // Integer part for indexing + vec<4, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1 + Pi0 = mod(Pi0, vec<4, T, Q>(289)); + Pi1 = mod(Pi1, vec<4, T, Q>(289)); + vec<4, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<4, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + vec<4, T, Q> iw0(Pi0.w); + vec<4, T, Q> iw1(Pi1.w); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + vec<4, T, Q> ixy00 = detail::permute(ixy0 + iw0); + vec<4, T, Q> ixy01 = detail::permute(ixy0 + iw1); + vec<4, T, Q> ixy10 = detail::permute(ixy1 + iw0); + vec<4, T, Q> ixy11 = detail::permute(ixy1 + iw1); + + vec<4, T, Q> gx00 = ixy00 / T(7); + vec<4, T, Q> gy00 = floor(gx00) / T(7); + vec<4, T, Q> gz00 = floor(gy00) / T(6); + gx00 = fract(gx00) - T(0.5); + gy00 = fract(gy00) - T(0.5); + gz00 = fract(gz00) - T(0.5); + vec<4, T, Q> gw00 = vec<4, T, Q>(0.75) - abs(gx00) - abs(gy00) - abs(gz00); + vec<4, T, Q> sw00 = step(gw00, vec<4, T, Q>(0.0)); + gx00 -= sw00 * (step(T(0), gx00) - T(0.5)); + gy00 -= sw00 * (step(T(0), gy00) - T(0.5)); + + vec<4, T, Q> gx01 = ixy01 / T(7); + vec<4, T, Q> gy01 = floor(gx01) / T(7); + vec<4, T, Q> gz01 = floor(gy01) / T(6); + gx01 = fract(gx01) - T(0.5); + gy01 = fract(gy01) - T(0.5); + gz01 = fract(gz01) - T(0.5); + vec<4, T, Q> gw01 = vec<4, T, Q>(0.75) - abs(gx01) - abs(gy01) - abs(gz01); + vec<4, T, Q> sw01 = step(gw01, vec<4, T, Q>(0.0)); + gx01 -= sw01 * (step(T(0), gx01) - T(0.5)); + gy01 -= sw01 * (step(T(0), gy01) - T(0.5)); + + vec<4, T, Q> gx10 = ixy10 / T(7); + vec<4, T, Q> gy10 = floor(gx10) / T(7); + vec<4, T, Q> gz10 = floor(gy10) / T(6); + gx10 = fract(gx10) - T(0.5); + gy10 = fract(gy10) - T(0.5); + gz10 = fract(gz10) - T(0.5); + vec<4, T, Q> gw10 = vec<4, T, Q>(0.75) - abs(gx10) - abs(gy10) - abs(gz10); + vec<4, T, Q> sw10 = step(gw10, vec<4, T, Q>(0)); + gx10 -= sw10 * (step(T(0), gx10) - T(0.5)); + gy10 -= sw10 * (step(T(0), gy10) - T(0.5)); + + vec<4, T, Q> gx11 = ixy11 / T(7); + vec<4, T, Q> gy11 = floor(gx11) / T(7); + vec<4, T, Q> gz11 = floor(gy11) / T(6); + gx11 = fract(gx11) - T(0.5); + gy11 = fract(gy11) - T(0.5); + gz11 = fract(gz11) - T(0.5); + vec<4, T, Q> gw11 = vec<4, T, Q>(0.75) - abs(gx11) - abs(gy11) - abs(gz11); + vec<4, T, Q> sw11 = step(gw11, vec<4, T, Q>(0.0)); + gx11 -= sw11 * (step(T(0), gx11) - T(0.5)); + gy11 -= sw11 * (step(T(0), gy11) - T(0.5)); + + vec<4, T, Q> g0000(gx00.x, gy00.x, gz00.x, gw00.x); + vec<4, T, Q> g1000(gx00.y, gy00.y, gz00.y, gw00.y); + vec<4, T, Q> g0100(gx00.z, gy00.z, gz00.z, gw00.z); + vec<4, T, Q> g1100(gx00.w, gy00.w, gz00.w, gw00.w); + vec<4, T, Q> g0010(gx10.x, gy10.x, gz10.x, gw10.x); + vec<4, T, Q> g1010(gx10.y, gy10.y, gz10.y, gw10.y); + vec<4, T, Q> g0110(gx10.z, gy10.z, gz10.z, gw10.z); + vec<4, T, Q> g1110(gx10.w, gy10.w, gz10.w, gw10.w); + vec<4, T, Q> g0001(gx01.x, gy01.x, gz01.x, gw01.x); + vec<4, T, Q> g1001(gx01.y, gy01.y, gz01.y, gw01.y); + vec<4, T, Q> g0101(gx01.z, gy01.z, gz01.z, gw01.z); + vec<4, T, Q> g1101(gx01.w, gy01.w, gz01.w, gw01.w); + vec<4, T, Q> g0011(gx11.x, gy11.x, gz11.x, gw11.x); + vec<4, T, Q> g1011(gx11.y, gy11.y, gz11.y, gw11.y); + vec<4, T, Q> g0111(gx11.z, gy11.z, gz11.z, gw11.z); + vec<4, T, Q> g1111(gx11.w, gy11.w, gz11.w, gw11.w); + + vec<4, T, Q> norm00 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); + g0000 *= norm00.x; + g0100 *= norm00.y; + g1000 *= norm00.z; + g1100 *= norm00.w; + + vec<4, T, Q> norm01 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); + g0001 *= norm01.x; + g0101 *= norm01.y; + g1001 *= norm01.z; + g1101 *= norm01.w; + + vec<4, T, Q> norm10 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); + g0010 *= norm10.x; + g0110 *= norm10.y; + g1010 *= norm10.z; + g1110 *= norm10.w; + + vec<4, T, Q> norm11 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); + g0011 *= norm11.x; + g0111 *= norm11.y; + g1011 *= norm11.z; + g1111 *= norm11.w; + + T n0000 = dot(g0000, Pf0); + T n1000 = dot(g1000, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf0.w)); + T n0100 = dot(g0100, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf0.w)); + T n1100 = dot(g1100, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf0.w)); + T n0010 = dot(g0010, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf0.w)); + T n1010 = dot(g1010, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); + T n0110 = dot(g0110, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf0.w)); + T n1110 = dot(g1110, vec<4, T, Q>(Pf1.x, Pf1.y, Pf1.z, Pf0.w)); + T n0001 = dot(g0001, vec<4, T, Q>(Pf0.x, Pf0.y, Pf0.z, Pf1.w)); + T n1001 = dot(g1001, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf1.w)); + T n0101 = dot(g0101, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); + T n1101 = dot(g1101, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf1.w)); + T n0011 = dot(g0011, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf1.w)); + T n1011 = dot(g1011, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf1.w)); + T n0111 = dot(g0111, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf1.w)); + T n1111 = dot(g1111, Pf1); + + vec<4, T, Q> fade_xyzw = detail::fade(Pf0); + vec<4, T, Q> n_0w = mix(vec<4, T, Q>(n0000, n1000, n0100, n1100), vec<4, T, Q>(n0001, n1001, n0101, n1101), fade_xyzw.w); + vec<4, T, Q> n_1w = mix(vec<4, T, Q>(n0010, n1010, n0110, n1110), vec<4, T, Q>(n0011, n1011, n0111, n1111), fade_xyzw.w); + vec<4, T, Q> n_zw = mix(n_0w, n_1w, fade_xyzw.z); + vec<2, T, Q> n_yzw = mix(vec<2, T, Q>(n_zw.x, n_zw.y), vec<2, T, Q>(n_zw.z, n_zw.w), fade_xyzw.y); + T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x); + return T(2.2) * n_xyzw; + } + + // Classic Perlin noise, periodic variant + template + GLM_FUNC_QUALIFIER T perlin(vec<2, T, Q> const& Position, vec<2, T, Q> const& rep) + { + vec<4, T, Q> Pi = floor(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) + vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + vec<4, T, Q> Pf = fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + Pi = mod(Pi, vec<4, T, Q>(rep.x, rep.y, rep.x, rep.y)); // To create noise with explicit period + Pi = mod(Pi, vec<4, T, Q>(289)); // To avoid truncation effects in permutation + vec<4, T, Q> ix(Pi.x, Pi.z, Pi.x, Pi.z); + vec<4, T, Q> iy(Pi.y, Pi.y, Pi.w, Pi.w); + vec<4, T, Q> fx(Pf.x, Pf.z, Pf.x, Pf.z); + vec<4, T, Q> fy(Pf.y, Pf.y, Pf.w, Pf.w); + + vec<4, T, Q> i = detail::permute(detail::permute(ix) + iy); + + vec<4, T, Q> gx = static_cast(2) * fract(i / T(41)) - T(1); + vec<4, T, Q> gy = abs(gx) - T(0.5); + vec<4, T, Q> tx = floor(gx + T(0.5)); + gx = gx - tx; + + vec<2, T, Q> g00(gx.x, gy.x); + vec<2, T, Q> g10(gx.y, gy.y); + vec<2, T, Q> g01(gx.z, gy.z); + vec<2, T, Q> g11(gx.w, gy.w); + + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); + g00 *= norm.x; + g01 *= norm.y; + g10 *= norm.z; + g11 *= norm.w; + + T n00 = dot(g00, vec<2, T, Q>(fx.x, fy.x)); + T n10 = dot(g10, vec<2, T, Q>(fx.y, fy.y)); + T n01 = dot(g01, vec<2, T, Q>(fx.z, fy.z)); + T n11 = dot(g11, vec<2, T, Q>(fx.w, fy.w)); + + vec<2, T, Q> fade_xy = detail::fade(vec<2, T, Q>(Pf.x, Pf.y)); + vec<2, T, Q> n_x = mix(vec<2, T, Q>(n00, n01), vec<2, T, Q>(n10, n11), fade_xy.x); + T n_xy = mix(n_x.x, n_x.y, fade_xy.y); + return T(2.3) * n_xy; + } + + // Classic Perlin noise, periodic variant + template + GLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& Position, vec<3, T, Q> const& rep) + { + vec<3, T, Q> Pi0 = mod(floor(Position), rep); // Integer part, modulo period + vec<3, T, Q> Pi1 = mod(Pi0 + vec<3, T, Q>(T(1)), rep); // Integer part + 1, mod period + Pi0 = mod(Pi0, vec<3, T, Q>(289)); + Pi1 = mod(Pi1, vec<3, T, Q>(289)); + vec<3, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<3, T, Q> Pf1 = Pf0 - vec<3, T, Q>(T(1)); // Fractional part - 1.0 + vec<4, T, Q> ix = vec<4, T, Q>(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy = vec<4, T, Q>(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + + vec<4, T, Q> gx0 = ixy0 / T(7); + vec<4, T, Q> gy0 = fract(floor(gx0) / T(7)) - T(0.5); + gx0 = fract(gx0); + vec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0); + vec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0)); + gx0 -= sz0 * (step(T(0), gx0) - T(0.5)); + gy0 -= sz0 * (step(T(0), gy0) - T(0.5)); + + vec<4, T, Q> gx1 = ixy1 / T(7); + vec<4, T, Q> gy1 = fract(floor(gx1) / T(7)) - T(0.5); + gx1 = fract(gx1); + vec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1); + vec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(T(0))); + gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); + gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); + + vec<3, T, Q> g000 = vec<3, T, Q>(gx0.x, gy0.x, gz0.x); + vec<3, T, Q> g100 = vec<3, T, Q>(gx0.y, gy0.y, gz0.y); + vec<3, T, Q> g010 = vec<3, T, Q>(gx0.z, gy0.z, gz0.z); + vec<3, T, Q> g110 = vec<3, T, Q>(gx0.w, gy0.w, gz0.w); + vec<3, T, Q> g001 = vec<3, T, Q>(gx1.x, gy1.x, gz1.x); + vec<3, T, Q> g101 = vec<3, T, Q>(gx1.y, gy1.y, gz1.y); + vec<3, T, Q> g011 = vec<3, T, Q>(gx1.z, gy1.z, gz1.z); + vec<3, T, Q> g111 = vec<3, T, Q>(gx1.w, gy1.w, gz1.w); + + vec<4, T, Q> norm0 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + vec<4, T, Q> norm1 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + T n000 = dot(g000, Pf0); + T n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z)); + T n111 = dot(g111, Pf1); + + vec<3, T, Q> fade_xyz = detail::fade(Pf0); + vec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z); + vec<2, T, Q> n_yz = mix(vec<2, T, Q>(n_z.x, n_z.y), vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return T(2.2) * n_xyz; + } + + // Classic Perlin noise, periodic version + template + GLM_FUNC_QUALIFIER T perlin(vec<4, T, Q> const& Position, vec<4, T, Q> const& rep) + { + vec<4, T, Q> Pi0 = mod(floor(Position), rep); // Integer part modulo rep + vec<4, T, Q> Pi1 = mod(Pi0 + T(1), rep); // Integer part + 1 mod rep + vec<4, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<4, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix = vec<4, T, Q>(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy = vec<4, T, Q>(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + vec<4, T, Q> iw0(Pi0.w); + vec<4, T, Q> iw1(Pi1.w); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + vec<4, T, Q> ixy00 = detail::permute(ixy0 + iw0); + vec<4, T, Q> ixy01 = detail::permute(ixy0 + iw1); + vec<4, T, Q> ixy10 = detail::permute(ixy1 + iw0); + vec<4, T, Q> ixy11 = detail::permute(ixy1 + iw1); + + vec<4, T, Q> gx00 = ixy00 / T(7); + vec<4, T, Q> gy00 = floor(gx00) / T(7); + vec<4, T, Q> gz00 = floor(gy00) / T(6); + gx00 = fract(gx00) - T(0.5); + gy00 = fract(gy00) - T(0.5); + gz00 = fract(gz00) - T(0.5); + vec<4, T, Q> gw00 = vec<4, T, Q>(0.75) - abs(gx00) - abs(gy00) - abs(gz00); + vec<4, T, Q> sw00 = step(gw00, vec<4, T, Q>(0)); + gx00 -= sw00 * (step(T(0), gx00) - T(0.5)); + gy00 -= sw00 * (step(T(0), gy00) - T(0.5)); + + vec<4, T, Q> gx01 = ixy01 / T(7); + vec<4, T, Q> gy01 = floor(gx01) / T(7); + vec<4, T, Q> gz01 = floor(gy01) / T(6); + gx01 = fract(gx01) - T(0.5); + gy01 = fract(gy01) - T(0.5); + gz01 = fract(gz01) - T(0.5); + vec<4, T, Q> gw01 = vec<4, T, Q>(0.75) - abs(gx01) - abs(gy01) - abs(gz01); + vec<4, T, Q> sw01 = step(gw01, vec<4, T, Q>(0.0)); + gx01 -= sw01 * (step(T(0), gx01) - T(0.5)); + gy01 -= sw01 * (step(T(0), gy01) - T(0.5)); + + vec<4, T, Q> gx10 = ixy10 / T(7); + vec<4, T, Q> gy10 = floor(gx10) / T(7); + vec<4, T, Q> gz10 = floor(gy10) / T(6); + gx10 = fract(gx10) - T(0.5); + gy10 = fract(gy10) - T(0.5); + gz10 = fract(gz10) - T(0.5); + vec<4, T, Q> gw10 = vec<4, T, Q>(0.75) - abs(gx10) - abs(gy10) - abs(gz10); + vec<4, T, Q> sw10 = step(gw10, vec<4, T, Q>(0.0)); + gx10 -= sw10 * (step(T(0), gx10) - T(0.5)); + gy10 -= sw10 * (step(T(0), gy10) - T(0.5)); + + vec<4, T, Q> gx11 = ixy11 / T(7); + vec<4, T, Q> gy11 = floor(gx11) / T(7); + vec<4, T, Q> gz11 = floor(gy11) / T(6); + gx11 = fract(gx11) - T(0.5); + gy11 = fract(gy11) - T(0.5); + gz11 = fract(gz11) - T(0.5); + vec<4, T, Q> gw11 = vec<4, T, Q>(0.75) - abs(gx11) - abs(gy11) - abs(gz11); + vec<4, T, Q> sw11 = step(gw11, vec<4, T, Q>(T(0))); + gx11 -= sw11 * (step(T(0), gx11) - T(0.5)); + gy11 -= sw11 * (step(T(0), gy11) - T(0.5)); + + vec<4, T, Q> g0000(gx00.x, gy00.x, gz00.x, gw00.x); + vec<4, T, Q> g1000(gx00.y, gy00.y, gz00.y, gw00.y); + vec<4, T, Q> g0100(gx00.z, gy00.z, gz00.z, gw00.z); + vec<4, T, Q> g1100(gx00.w, gy00.w, gz00.w, gw00.w); + vec<4, T, Q> g0010(gx10.x, gy10.x, gz10.x, gw10.x); + vec<4, T, Q> g1010(gx10.y, gy10.y, gz10.y, gw10.y); + vec<4, T, Q> g0110(gx10.z, gy10.z, gz10.z, gw10.z); + vec<4, T, Q> g1110(gx10.w, gy10.w, gz10.w, gw10.w); + vec<4, T, Q> g0001(gx01.x, gy01.x, gz01.x, gw01.x); + vec<4, T, Q> g1001(gx01.y, gy01.y, gz01.y, gw01.y); + vec<4, T, Q> g0101(gx01.z, gy01.z, gz01.z, gw01.z); + vec<4, T, Q> g1101(gx01.w, gy01.w, gz01.w, gw01.w); + vec<4, T, Q> g0011(gx11.x, gy11.x, gz11.x, gw11.x); + vec<4, T, Q> g1011(gx11.y, gy11.y, gz11.y, gw11.y); + vec<4, T, Q> g0111(gx11.z, gy11.z, gz11.z, gw11.z); + vec<4, T, Q> g1111(gx11.w, gy11.w, gz11.w, gw11.w); + + vec<4, T, Q> norm00 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); + g0000 *= norm00.x; + g0100 *= norm00.y; + g1000 *= norm00.z; + g1100 *= norm00.w; + + vec<4, T, Q> norm01 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); + g0001 *= norm01.x; + g0101 *= norm01.y; + g1001 *= norm01.z; + g1101 *= norm01.w; + + vec<4, T, Q> norm10 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); + g0010 *= norm10.x; + g0110 *= norm10.y; + g1010 *= norm10.z; + g1110 *= norm10.w; + + vec<4, T, Q> norm11 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); + g0011 *= norm11.x; + g0111 *= norm11.y; + g1011 *= norm11.z; + g1111 *= norm11.w; + + T n0000 = dot(g0000, Pf0); + T n1000 = dot(g1000, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf0.w)); + T n0100 = dot(g0100, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf0.w)); + T n1100 = dot(g1100, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf0.w)); + T n0010 = dot(g0010, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf0.w)); + T n1010 = dot(g1010, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); + T n0110 = dot(g0110, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf0.w)); + T n1110 = dot(g1110, vec<4, T, Q>(Pf1.x, Pf1.y, Pf1.z, Pf0.w)); + T n0001 = dot(g0001, vec<4, T, Q>(Pf0.x, Pf0.y, Pf0.z, Pf1.w)); + T n1001 = dot(g1001, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf1.w)); + T n0101 = dot(g0101, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); + T n1101 = dot(g1101, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf1.w)); + T n0011 = dot(g0011, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf1.w)); + T n1011 = dot(g1011, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf1.w)); + T n0111 = dot(g0111, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf1.w)); + T n1111 = dot(g1111, Pf1); + + vec<4, T, Q> fade_xyzw = detail::fade(Pf0); + vec<4, T, Q> n_0w = mix(vec<4, T, Q>(n0000, n1000, n0100, n1100), vec<4, T, Q>(n0001, n1001, n0101, n1101), fade_xyzw.w); + vec<4, T, Q> n_1w = mix(vec<4, T, Q>(n0010, n1010, n0110, n1110), vec<4, T, Q>(n0011, n1011, n0111, n1111), fade_xyzw.w); + vec<4, T, Q> n_zw = mix(n_0w, n_1w, fade_xyzw.z); + vec<2, T, Q> n_yzw = mix(vec<2, T, Q>(n_zw.x, n_zw.y), vec<2, T, Q>(n_zw.z, n_zw.w), fade_xyzw.y); + T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x); + return T(2.2) * n_xyzw; + } + + template + GLM_FUNC_QUALIFIER T simplex(glm::vec<2, T, Q> const& v) + { + vec<4, T, Q> const C = vec<4, T, Q>( + T( 0.211324865405187), // (3.0 - sqrt(3.0)) / 6.0 + T( 0.366025403784439), // 0.5 * (sqrt(3.0) - 1.0) + T(-0.577350269189626), // -1.0 + 2.0 * C.x + T( 0.024390243902439)); // 1.0 / 41.0 + + // First corner + vec<2, T, Q> i = floor(v + dot(v, vec<2, T, Q>(C[1]))); + vec<2, T, Q> x0 = v - i + dot(i, vec<2, T, Q>(C[0])); + + // Other corners + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + vec<2, T, Q> i1 = (x0.x > x0.y) ? vec<2, T, Q>(1, 0) : vec<2, T, Q>(0, 1); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec<4, T, Q> x12 = vec<4, T, Q>(x0.x, x0.y, x0.x, x0.y) + vec<4, T, Q>(C.x, C.x, C.z, C.z); + x12 = vec<4, T, Q>(vec<2, T, Q>(x12) - i1, x12.z, x12.w); + + // Permutations + i = mod(i, vec<2, T, Q>(289)); // Avoid truncation effects in permutation + vec<3, T, Q> p = detail::permute( + detail::permute(i.y + vec<3, T, Q>(T(0), i1.y, T(1))) + + i.x + vec<3, T, Q>(T(0), i1.x, T(1))); + + vec<3, T, Q> m = max(vec<3, T, Q>(0.5) - vec<3, T, Q>( + dot(x0, x0), + dot(vec<2, T, Q>(x12.x, x12.y), vec<2, T, Q>(x12.x, x12.y)), + dot(vec<2, T, Q>(x12.z, x12.w), vec<2, T, Q>(x12.z, x12.w))), vec<3, T, Q>(0)); + m = m * m ; + m = m * m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec<3, T, Q> x = static_cast(2) * fract(p * C.w) - T(1); + vec<3, T, Q> h = abs(x) - T(0.5); + vec<3, T, Q> ox = floor(x + T(0.5)); + vec<3, T, Q> a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h ); + m *= static_cast(1.79284291400159) - T(0.85373472095314) * (a0 * a0 + h * h); + + // Compute final noise value at P + vec<3, T, Q> g; + g.x = a0.x * x0.x + h.x * x0.y; + //g.yz = a0.yz * x12.xz + h.yz * x12.yw; + g.y = a0.y * x12.x + h.y * x12.y; + g.z = a0.z * x12.z + h.z * x12.w; + return T(130) * dot(m, g); + } + + template + GLM_FUNC_QUALIFIER T simplex(vec<3, T, Q> const& v) + { + vec<2, T, Q> const C(1.0 / 6.0, 1.0 / 3.0); + vec<4, T, Q> const D(0.0, 0.5, 1.0, 2.0); + + // First corner + vec<3, T, Q> i(floor(v + dot(v, vec<3, T, Q>(C.y)))); + vec<3, T, Q> x0(v - i + dot(i, vec<3, T, Q>(C.x))); + + // Other corners + vec<3, T, Q> g(step(vec<3, T, Q>(x0.y, x0.z, x0.x), x0)); + vec<3, T, Q> l(T(1) - g); + vec<3, T, Q> i1(min(g, vec<3, T, Q>(l.z, l.x, l.y))); + vec<3, T, Q> i2(max(g, vec<3, T, Q>(l.z, l.x, l.y))); + + // x0 = x0 - 0.0 + 0.0 * C.xxx; + // x1 = x0 - i1 + 1.0 * C.xxx; + // x2 = x0 - i2 + 2.0 * C.xxx; + // x3 = x0 - 1.0 + 3.0 * C.xxx; + vec<3, T, Q> x1(x0 - i1 + C.x); + vec<3, T, Q> x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y + vec<3, T, Q> x3(x0 - D.y); // -1.0+3.0*C.x = -0.5 = -D.y + + // Permutations + i = detail::mod289(i); + vec<4, T, Q> p(detail::permute(detail::permute(detail::permute( + i.z + vec<4, T, Q>(T(0), i1.z, i2.z, T(1))) + + i.y + vec<4, T, Q>(T(0), i1.y, i2.y, T(1))) + + i.x + vec<4, T, Q>(T(0), i1.x, i2.x, T(1)))); + + // Gradients: 7x7 points over a square, mapped onto an octahedron. + // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) + T n_ = static_cast(0.142857142857); // 1.0/7.0 + vec<3, T, Q> ns(n_ * vec<3, T, Q>(D.w, D.y, D.z) - vec<3, T, Q>(D.x, D.z, D.x)); + + vec<4, T, Q> j(p - T(49) * floor(p * ns.z * ns.z)); // mod(p,7*7) + + vec<4, T, Q> x_(floor(j * ns.z)); + vec<4, T, Q> y_(floor(j - T(7) * x_)); // mod(j,N) + + vec<4, T, Q> x(x_ * ns.x + ns.y); + vec<4, T, Q> y(y_ * ns.x + ns.y); + vec<4, T, Q> h(T(1) - abs(x) - abs(y)); + + vec<4, T, Q> b0(x.x, x.y, y.x, y.y); + vec<4, T, Q> b1(x.z, x.w, y.z, y.w); + + // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; + // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; + vec<4, T, Q> s0(floor(b0) * T(2) + T(1)); + vec<4, T, Q> s1(floor(b1) * T(2) + T(1)); + vec<4, T, Q> sh(-step(h, vec<4, T, Q>(0.0))); + + vec<4, T, Q> a0 = vec<4, T, Q>(b0.x, b0.z, b0.y, b0.w) + vec<4, T, Q>(s0.x, s0.z, s0.y, s0.w) * vec<4, T, Q>(sh.x, sh.x, sh.y, sh.y); + vec<4, T, Q> a1 = vec<4, T, Q>(b1.x, b1.z, b1.y, b1.w) + vec<4, T, Q>(s1.x, s1.z, s1.y, s1.w) * vec<4, T, Q>(sh.z, sh.z, sh.w, sh.w); + + vec<3, T, Q> p0(a0.x, a0.y, h.x); + vec<3, T, Q> p1(a0.z, a0.w, h.y); + vec<3, T, Q> p2(a1.x, a1.y, h.z); + vec<3, T, Q> p3(a1.z, a1.w, h.w); + + // Normalise gradients + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + // Mix final noise value + vec<4, T, Q> m = max(T(0.6) - vec<4, T, Q>(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), vec<4, T, Q>(0)); + m = m * m; + return T(42) * dot(m * m, vec<4, T, Q>(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); + } + + template + GLM_FUNC_QUALIFIER T simplex(vec<4, T, Q> const& v) + { + vec<4, T, Q> const C( + 0.138196601125011, // (5 - sqrt(5))/20 G4 + 0.276393202250021, // 2 * G4 + 0.414589803375032, // 3 * G4 + -0.447213595499958); // -1 + 4 * G4 + + // (sqrt(5) - 1)/4 = F4, used once below + T const F4 = static_cast(0.309016994374947451); + + // First corner + vec<4, T, Q> i = floor(v + dot(v, vec<4, T, Q>(F4))); + vec<4, T, Q> x0 = v - i + dot(i, vec<4, T, Q>(C.x)); + + // Other corners + + // Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI) + vec<4, T, Q> i0; + vec<3, T, Q> isX = step(vec<3, T, Q>(x0.y, x0.z, x0.w), vec<3, T, Q>(x0.x)); + vec<3, T, Q> isYZ = step(vec<3, T, Q>(x0.z, x0.w, x0.w), vec<3, T, Q>(x0.y, x0.y, x0.z)); + // i0.x = dot(isX, vec3(1.0)); + //i0.x = isX.x + isX.y + isX.z; + //i0.yzw = static_cast(1) - isX; + i0 = vec<4, T, Q>(isX.x + isX.y + isX.z, T(1) - isX); + // i0.y += dot(isYZ.xy, vec2(1.0)); + i0.y += isYZ.x + isYZ.y; + //i0.zw += 1.0 - vec<2, T, Q>(isYZ.x, isYZ.y); + i0.z += static_cast(1) - isYZ.x; + i0.w += static_cast(1) - isYZ.y; + i0.z += isYZ.z; + i0.w += static_cast(1) - isYZ.z; + + // i0 now contains the unique values 0,1,2,3 in each channel + vec<4, T, Q> i3 = clamp(i0, T(0), T(1)); + vec<4, T, Q> i2 = clamp(i0 - T(1), T(0), T(1)); + vec<4, T, Q> i1 = clamp(i0 - T(2), T(0), T(1)); + + // x0 = x0 - 0.0 + 0.0 * C.xxxx + // x1 = x0 - i1 + 0.0 * C.xxxx + // x2 = x0 - i2 + 0.0 * C.xxxx + // x3 = x0 - i3 + 0.0 * C.xxxx + // x4 = x0 - 1.0 + 4.0 * C.xxxx + vec<4, T, Q> x1 = x0 - i1 + C.x; + vec<4, T, Q> x2 = x0 - i2 + C.y; + vec<4, T, Q> x3 = x0 - i3 + C.z; + vec<4, T, Q> x4 = x0 + C.w; + + // Permutations + i = mod(i, vec<4, T, Q>(289)); + T j0 = detail::permute(detail::permute(detail::permute(detail::permute(i.w) + i.z) + i.y) + i.x); + vec<4, T, Q> j1 = detail::permute(detail::permute(detail::permute(detail::permute( + i.w + vec<4, T, Q>(i1.w, i2.w, i3.w, T(1))) + + i.z + vec<4, T, Q>(i1.z, i2.z, i3.z, T(1))) + + i.y + vec<4, T, Q>(i1.y, i2.y, i3.y, T(1))) + + i.x + vec<4, T, Q>(i1.x, i2.x, i3.x, T(1))); + + // Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope + // 7*7*6 = 294, which is close to the ring size 17*17 = 289. + vec<4, T, Q> ip = vec<4, T, Q>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0)); + + vec<4, T, Q> p0 = gtc::grad4(j0, ip); + vec<4, T, Q> p1 = gtc::grad4(j1.x, ip); + vec<4, T, Q> p2 = gtc::grad4(j1.y, ip); + vec<4, T, Q> p3 = gtc::grad4(j1.z, ip); + vec<4, T, Q> p4 = gtc::grad4(j1.w, ip); + + // Normalise gradients + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + p4 *= detail::taylorInvSqrt(dot(p4, p4)); + + // Mix contributions from the five corners + vec<3, T, Q> m0 = max(T(0.6) - vec<3, T, Q>(dot(x0, x0), dot(x1, x1), dot(x2, x2)), vec<3, T, Q>(0)); + vec<2, T, Q> m1 = max(T(0.6) - vec<2, T, Q>(dot(x3, x3), dot(x4, x4) ), vec<2, T, Q>(0)); + m0 = m0 * m0; + m1 = m1 * m1; + return T(49) * + (dot(m0 * m0, vec<3, T, Q>(dot(p0, x0), dot(p1, x1), dot(p2, x2))) + + dot(m1 * m1, vec<2, T, Q>(dot(p3, x3), dot(p4, x4)))); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/packing.hpp b/NothinFancy/dep/include/glm/gtc/packing.hpp new file mode 100644 index 0000000..8e416b3 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/packing.hpp @@ -0,0 +1,728 @@ +/// @ref gtc_packing +/// @file glm/gtc/packing.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_packing GLM_GTC_packing +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// This extension provides a set of function to convert vertors to packed +/// formats. + +#pragma once + +// Dependency: +#include "type_precision.hpp" +#include "../ext/vector_packing.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_packing extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_packing + /// @{ + + /// First, converts the normalized floating-point value v into a 8-bit integer value. + /// Then, the results are packed into the returned 8-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm1x8: round(clamp(c, 0, +1) * 255.0) + /// + /// @see gtc_packing + /// @see uint16 packUnorm2x8(vec2 const& v) + /// @see uint32 packUnorm4x8(vec4 const& v) + /// @see GLSL packUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint8 packUnorm1x8(float v); + + /// Convert a single 8-bit integer to a normalized floating-point value. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm4x8: f / 255.0 + /// + /// @see gtc_packing + /// @see vec2 unpackUnorm2x8(uint16 p) + /// @see vec4 unpackUnorm4x8(uint32 p) + /// @see GLSL unpackUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL float unpackUnorm1x8(uint8 p); + + /// First, converts each component of the normalized floating-point value v into 8-bit integer values. + /// Then, the results are packed into the returned 16-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm2x8: round(clamp(c, 0, +1) * 255.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see gtc_packing + /// @see uint8 packUnorm1x8(float const& v) + /// @see uint32 packUnorm4x8(vec4 const& v) + /// @see GLSL packUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint16 packUnorm2x8(vec2 const& v); + + /// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit unsigned integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm4x8: f / 255.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see float unpackUnorm1x8(uint8 v) + /// @see vec4 unpackUnorm4x8(uint32 p) + /// @see GLSL unpackUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec2 unpackUnorm2x8(uint16 p); + + /// First, converts the normalized floating-point value v into 8-bit integer value. + /// Then, the results are packed into the returned 8-bit unsigned integer. + /// + /// The conversion to fixed point is done as follows: + /// packSnorm1x8: round(clamp(s, -1, +1) * 127.0) + /// + /// @see gtc_packing + /// @see uint16 packSnorm2x8(vec2 const& v) + /// @see uint32 packSnorm4x8(vec4 const& v) + /// @see GLSL packSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint8 packSnorm1x8(float s); + + /// First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed integers. + /// Then, the value is converted to a normalized floating-point value to generate the returned scalar. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm1x8: clamp(f / 127.0, -1, +1) + /// + /// @see gtc_packing + /// @see vec2 unpackSnorm2x8(uint16 p) + /// @see vec4 unpackSnorm4x8(uint32 p) + /// @see GLSL unpackSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL float unpackSnorm1x8(uint8 p); + + /// First, converts each component of the normalized floating-point value v into 8-bit integer values. + /// Then, the results are packed into the returned 16-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm2x8: round(clamp(c, -1, +1) * 127.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see gtc_packing + /// @see uint8 packSnorm1x8(float const& v) + /// @see uint32 packSnorm4x8(vec4 const& v) + /// @see GLSL packSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint16 packSnorm2x8(vec2 const& v); + + /// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm2x8: clamp(f / 127.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see float unpackSnorm1x8(uint8 p) + /// @see vec4 unpackSnorm4x8(uint32 p) + /// @see GLSL unpackSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec2 unpackSnorm2x8(uint16 p); + + /// First, converts the normalized floating-point value v into a 16-bit integer value. + /// Then, the results are packed into the returned 16-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm1x16: round(clamp(c, 0, +1) * 65535.0) + /// + /// @see gtc_packing + /// @see uint16 packSnorm1x16(float const& v) + /// @see uint64 packSnorm4x16(vec4 const& v) + /// @see GLSL packUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint16 packUnorm1x16(float v); + + /// First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned integers. + /// Then, the value is converted to a normalized floating-point value to generate the returned scalar. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm1x16: f / 65535.0 + /// + /// @see gtc_packing + /// @see vec2 unpackUnorm2x16(uint32 p) + /// @see vec4 unpackUnorm4x16(uint64 p) + /// @see GLSL unpackUnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL float unpackUnorm1x16(uint16 p); + + /// First, converts each component of the normalized floating-point value v into 16-bit integer values. + /// Then, the results are packed into the returned 64-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm4x16: round(clamp(c, 0, +1) * 65535.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see gtc_packing + /// @see uint16 packUnorm1x16(float const& v) + /// @see uint32 packUnorm2x16(vec2 const& v) + /// @see GLSL packUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint64 packUnorm4x16(vec4 const& v); + + /// First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnormx4x16: f / 65535.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see float unpackUnorm1x16(uint16 p) + /// @see vec2 unpackUnorm2x16(uint32 p) + /// @see GLSL unpackUnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec4 unpackUnorm4x16(uint64 p); + + /// First, converts the normalized floating-point value v into 16-bit integer value. + /// Then, the results are packed into the returned 16-bit unsigned integer. + /// + /// The conversion to fixed point is done as follows: + /// packSnorm1x8: round(clamp(s, -1, +1) * 32767.0) + /// + /// @see gtc_packing + /// @see uint32 packSnorm2x16(vec2 const& v) + /// @see uint64 packSnorm4x16(vec4 const& v) + /// @see GLSL packSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint16 packSnorm1x16(float v); + + /// First, unpacks a single 16-bit unsigned integer p into a single 16-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned scalar. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm1x16: clamp(f / 32767.0, -1, +1) + /// + /// @see gtc_packing + /// @see vec2 unpackSnorm2x16(uint32 p) + /// @see vec4 unpackSnorm4x16(uint64 p) + /// @see GLSL unpackSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL float unpackSnorm1x16(uint16 p); + + /// First, converts each component of the normalized floating-point value v into 16-bit integer values. + /// Then, the results are packed into the returned 64-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm2x8: round(clamp(c, -1, +1) * 32767.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see gtc_packing + /// @see uint16 packSnorm1x16(float const& v) + /// @see uint32 packSnorm2x16(vec2 const& v) + /// @see GLSL packSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint64 packSnorm4x16(vec4 const& v); + + /// First, unpacks a single 64-bit unsigned integer p into four 16-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm4x16: clamp(f / 32767.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see float unpackSnorm1x16(uint16 p) + /// @see vec2 unpackSnorm2x16(uint32 p) + /// @see GLSL unpackSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec4 unpackSnorm4x16(uint64 p); + + /// Returns an unsigned integer obtained by converting the components of a floating-point scalar + /// to the 16-bit floating-point representation found in the OpenGL Specification, + /// and then packing this 16-bit value into a 16-bit unsigned integer. + /// + /// @see gtc_packing + /// @see uint32 packHalf2x16(vec2 const& v) + /// @see uint64 packHalf4x16(vec4 const& v) + /// @see GLSL packHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint16 packHalf1x16(float v); + + /// Returns a floating-point scalar with components obtained by unpacking a 16-bit unsigned integer into a 16-bit value, + /// interpreted as a 16-bit floating-point number according to the OpenGL Specification, + /// and converting it to 32-bit floating-point values. + /// + /// @see gtc_packing + /// @see vec2 unpackHalf2x16(uint32 const& v) + /// @see vec4 unpackHalf4x16(uint64 const& v) + /// @see GLSL unpackHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL float unpackHalf1x16(uint16 v); + + /// Returns an unsigned integer obtained by converting the components of a four-component floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification, + /// and then packing these four 16-bit values into a 64-bit unsigned integer. + /// The first vector component specifies the 16 least-significant bits of the result; + /// the forth component specifies the 16 most-significant bits. + /// + /// @see gtc_packing + /// @see uint16 packHalf1x16(float const& v) + /// @see uint32 packHalf2x16(vec2 const& v) + /// @see GLSL packHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint64 packHalf4x16(vec4 const& v); + + /// Returns a four-component floating-point vector with components obtained by unpacking a 64-bit unsigned integer into four 16-bit values, + /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, + /// and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the forth component is obtained from the 16 most-significant bits of v. + /// + /// @see gtc_packing + /// @see float unpackHalf1x16(uint16 const& v) + /// @see vec2 unpackHalf2x16(uint32 const& v) + /// @see GLSL unpackHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec4 unpackHalf4x16(uint64 p); + + /// Returns an unsigned integer obtained by converting the components of a four-component signed integer vector + /// to the 10-10-10-2-bit signed integer representation found in the OpenGL Specification, + /// and then packing these four values into a 32-bit unsigned integer. + /// The first vector component specifies the 10 least-significant bits of the result; + /// the forth component specifies the 2 most-significant bits. + /// + /// @see gtc_packing + /// @see uint32 packI3x10_1x2(uvec4 const& v) + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see ivec4 unpackI3x10_1x2(uint32 const& p) + GLM_FUNC_DECL uint32 packI3x10_1x2(ivec4 const& v); + + /// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit signed integers. + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see vec4 unpackSnorm3x10_1x2(uint32 const& p); + /// @see uvec4 unpackI3x10_1x2(uint32 const& p); + GLM_FUNC_DECL ivec4 unpackI3x10_1x2(uint32 p); + + /// Returns an unsigned integer obtained by converting the components of a four-component unsigned integer vector + /// to the 10-10-10-2-bit unsigned integer representation found in the OpenGL Specification, + /// and then packing these four values into a 32-bit unsigned integer. + /// The first vector component specifies the 10 least-significant bits of the result; + /// the forth component specifies the 2 most-significant bits. + /// + /// @see gtc_packing + /// @see uint32 packI3x10_1x2(ivec4 const& v) + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see ivec4 unpackU3x10_1x2(uint32 const& p) + GLM_FUNC_DECL uint32 packU3x10_1x2(uvec4 const& v); + + /// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit unsigned integers. + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see vec4 unpackSnorm3x10_1x2(uint32 const& p); + /// @see uvec4 unpackI3x10_1x2(uint32 const& p); + GLM_FUNC_DECL uvec4 unpackU3x10_1x2(uint32 p); + + /// First, converts the first three components of the normalized floating-point value v into 10-bit signed integer values. + /// Then, converts the forth component of the normalized floating-point value v into 2-bit signed integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm3x10_1x2(xyz): round(clamp(c, -1, +1) * 511.0) + /// packSnorm3x10_1x2(w): round(clamp(c, -1, +1) * 1.0) + /// + /// The first vector component specifies the 10 least-significant bits of the result; + /// the forth component specifies the 2 most-significant bits. + /// + /// @see gtc_packing + /// @see vec4 unpackSnorm3x10_1x2(uint32 const& p) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see uint32 packI3x10_1x2(ivec4 const& v) + GLM_FUNC_DECL uint32 packSnorm3x10_1x2(vec4 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm3x10_1x2(xyz): clamp(f / 511.0, -1, +1) + /// unpackSnorm3x10_1x2(w): clamp(f / 511.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see vec4 unpackUnorm3x10_1x2(uint32 const& p)) + /// @see uvec4 unpackI3x10_1x2(uint32 const& p) + /// @see uvec4 unpackU3x10_1x2(uint32 const& p) + GLM_FUNC_DECL vec4 unpackSnorm3x10_1x2(uint32 p); + + /// First, converts the first three components of the normalized floating-point value v into 10-bit unsigned integer values. + /// Then, converts the forth component of the normalized floating-point value v into 2-bit signed uninteger values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm3x10_1x2(xyz): round(clamp(c, 0, +1) * 1023.0) + /// packUnorm3x10_1x2(w): round(clamp(c, 0, +1) * 3.0) + /// + /// The first vector component specifies the 10 least-significant bits of the result; + /// the forth component specifies the 2 most-significant bits. + /// + /// @see gtc_packing + /// @see vec4 unpackUnorm3x10_1x2(uint32 const& p) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see uint32 packI3x10_1x2(ivec4 const& v) + GLM_FUNC_DECL uint32 packUnorm3x10_1x2(vec4 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm3x10_1x2(xyz): clamp(f / 1023.0, 0, +1) + /// unpackSnorm3x10_1x2(w): clamp(f / 3.0, 0, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see vec4 unpackInorm3x10_1x2(uint32 const& p)) + /// @see uvec4 unpackI3x10_1x2(uint32 const& p) + /// @see uvec4 unpackU3x10_1x2(uint32 const& p) + GLM_FUNC_DECL vec4 unpackUnorm3x10_1x2(uint32 p); + + /// First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values. + /// Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The first vector component specifies the 11 least-significant bits of the result; + /// the last component specifies the 10 most-significant bits. + /// + /// @see gtc_packing + /// @see vec3 unpackF2x11_1x10(uint32 const& p) + GLM_FUNC_DECL uint32 packF2x11_1x10(vec3 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . + /// Then, each component is converted to a normalized floating-point value to generate the returned three-component vector. + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see uint32 packF2x11_1x10(vec3 const& v) + GLM_FUNC_DECL vec3 unpackF2x11_1x10(uint32 p); + + + /// First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values. + /// Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The first vector component specifies the 11 least-significant bits of the result; + /// the last component specifies the 10 most-significant bits. + /// + /// packF3x9_E1x5 allows encoding into RGBE / RGB9E5 format + /// + /// @see gtc_packing + /// @see vec3 unpackF3x9_E1x5(uint32 const& p) + GLM_FUNC_DECL uint32 packF3x9_E1x5(vec3 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . + /// Then, each component is converted to a normalized floating-point value to generate the returned three-component vector. + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// unpackF3x9_E1x5 allows decoding RGBE / RGB9E5 data + /// + /// @see gtc_packing + /// @see uint32 packF3x9_E1x5(vec3 const& v) + GLM_FUNC_DECL vec3 unpackF3x9_E1x5(uint32 p); + + /// Returns an unsigned integer vector obtained by converting the components of a floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification. + /// The first vector component specifies the 16 least-significant bits of the result; + /// the forth component specifies the 16 most-significant bits. + /// + /// @see gtc_packing + /// @see vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& p) + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + template + GLM_FUNC_DECL vec<4, T, Q> packRGBM(vec<3, T, Q> const& rgb); + + /// Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the forth component is obtained from the 16 most-significant bits of v. + /// + /// @see gtc_packing + /// @see vec<4, T, Q> packRGBM(vec<3, float, Q> const& v) + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + template + GLM_FUNC_DECL vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& rgbm); + + /// Returns an unsigned integer vector obtained by converting the components of a floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification. + /// The first vector component specifies the 16 least-significant bits of the result; + /// the forth component specifies the 16 most-significant bits. + /// + /// @see gtc_packing + /// @see vec unpackHalf(vec const& p) + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + template + GLM_FUNC_DECL vec packHalf(vec const& v); + + /// Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the forth component is obtained from the 16 most-significant bits of v. + /// + /// @see gtc_packing + /// @see vec packHalf(vec const& v) + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + template + GLM_FUNC_DECL vec unpackHalf(vec const& p); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec unpackUnorm(vec const& p); + template + GLM_FUNC_DECL vec packUnorm(vec const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see vec packUnorm(vec const& v) + template + GLM_FUNC_DECL vec unpackUnorm(vec const& v); + + /// Convert each component of the normalized floating-point vector into signed integer values. + /// + /// @see gtc_packing + /// @see vec unpackSnorm(vec const& p); + template + GLM_FUNC_DECL vec packSnorm(vec const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see vec packSnorm(vec const& v) + template + GLM_FUNC_DECL vec unpackSnorm(vec const& v); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec2 unpackUnorm2x4(uint8 p) + GLM_FUNC_DECL uint8 packUnorm2x4(vec2 const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see uint8 packUnorm2x4(vec2 const& v) + GLM_FUNC_DECL vec2 unpackUnorm2x4(uint8 p); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec4 unpackUnorm4x4(uint16 p) + GLM_FUNC_DECL uint16 packUnorm4x4(vec4 const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see uint16 packUnorm4x4(vec4 const& v) + GLM_FUNC_DECL vec4 unpackUnorm4x4(uint16 p); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec3 unpackUnorm1x5_1x6_1x5(uint16 p) + GLM_FUNC_DECL uint16 packUnorm1x5_1x6_1x5(vec3 const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see uint16 packUnorm1x5_1x6_1x5(vec3 const& v) + GLM_FUNC_DECL vec3 unpackUnorm1x5_1x6_1x5(uint16 p); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec4 unpackUnorm3x5_1x1(uint16 p) + GLM_FUNC_DECL uint16 packUnorm3x5_1x1(vec4 const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see uint16 packUnorm3x5_1x1(vec4 const& v) + GLM_FUNC_DECL vec4 unpackUnorm3x5_1x1(uint16 p); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec3 unpackUnorm2x3_1x2(uint8 p) + GLM_FUNC_DECL uint8 packUnorm2x3_1x2(vec3 const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see uint8 packUnorm2x3_1x2(vec3 const& v) + GLM_FUNC_DECL vec3 unpackUnorm2x3_1x2(uint8 p); + + + + /// Convert each component from an integer vector into a packed integer. + /// + /// @see gtc_packing + /// @see i8vec2 unpackInt2x8(int16 p) + GLM_FUNC_DECL int16 packInt2x8(i8vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int16 packInt2x8(i8vec2 const& v) + GLM_FUNC_DECL i8vec2 unpackInt2x8(int16 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u8vec2 unpackInt2x8(uint16 p) + GLM_FUNC_DECL uint16 packUint2x8(u8vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint16 packInt2x8(u8vec2 const& v) + GLM_FUNC_DECL u8vec2 unpackUint2x8(uint16 p); + + /// Convert each component from an integer vector into a packed integer. + /// + /// @see gtc_packing + /// @see i8vec4 unpackInt4x8(int32 p) + GLM_FUNC_DECL int32 packInt4x8(i8vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int32 packInt2x8(i8vec4 const& v) + GLM_FUNC_DECL i8vec4 unpackInt4x8(int32 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u8vec4 unpackUint4x8(uint32 p) + GLM_FUNC_DECL uint32 packUint4x8(u8vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint32 packUint4x8(u8vec2 const& v) + GLM_FUNC_DECL u8vec4 unpackUint4x8(uint32 p); + + /// Convert each component from an integer vector into a packed integer. + /// + /// @see gtc_packing + /// @see i16vec2 unpackInt2x16(int p) + GLM_FUNC_DECL int packInt2x16(i16vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int packInt2x16(i16vec2 const& v) + GLM_FUNC_DECL i16vec2 unpackInt2x16(int p); + + /// Convert each component from an integer vector into a packed integer. + /// + /// @see gtc_packing + /// @see i16vec4 unpackInt4x16(int64 p) + GLM_FUNC_DECL int64 packInt4x16(i16vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int64 packInt4x16(i16vec4 const& v) + GLM_FUNC_DECL i16vec4 unpackInt4x16(int64 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u16vec2 unpackUint2x16(uint p) + GLM_FUNC_DECL uint packUint2x16(u16vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint packUint2x16(u16vec2 const& v) + GLM_FUNC_DECL u16vec2 unpackUint2x16(uint p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u16vec4 unpackUint4x16(uint64 p) + GLM_FUNC_DECL uint64 packUint4x16(u16vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint64 packUint4x16(u16vec4 const& v) + GLM_FUNC_DECL u16vec4 unpackUint4x16(uint64 p); + + /// Convert each component from an integer vector into a packed integer. + /// + /// @see gtc_packing + /// @see i32vec2 unpackInt2x32(int p) + GLM_FUNC_DECL int64 packInt2x32(i32vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int packInt2x16(i32vec2 const& v) + GLM_FUNC_DECL i32vec2 unpackInt2x32(int64 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u32vec2 unpackUint2x32(int p) + GLM_FUNC_DECL uint64 packUint2x32(u32vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int packUint2x16(u32vec2 const& v) + GLM_FUNC_DECL u32vec2 unpackUint2x32(uint64 p); + + /// @} +}// namespace glm + +#include "packing.inl" diff --git a/NothinFancy/dep/include/glm/gtc/packing.inl b/NothinFancy/dep/include/glm/gtc/packing.inl new file mode 100644 index 0000000..8c906e1 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/packing.inl @@ -0,0 +1,938 @@ +/// @ref gtc_packing + +#include "../ext/scalar_relational.hpp" +#include "../ext/vector_relational.hpp" +#include "../common.hpp" +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../detail/type_half.hpp" +#include +#include + +namespace glm{ +namespace detail +{ + GLM_FUNC_QUALIFIER glm::uint16 float2half(glm::uint32 f) + { + // 10 bits => EE EEEFFFFF + // 11 bits => EEE EEFFFFFF + // Half bits => SEEEEEFF FFFFFFFF + // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF + + // 0x00007c00 => 00000000 00000000 01111100 00000000 + // 0x000003ff => 00000000 00000000 00000011 11111111 + // 0x38000000 => 00111000 00000000 00000000 00000000 + // 0x7f800000 => 01111111 10000000 00000000 00000000 + // 0x00008000 => 00000000 00000000 10000000 00000000 + return + ((f >> 16) & 0x8000) | // sign + ((((f & 0x7f800000) - 0x38000000) >> 13) & 0x7c00) | // exponential + ((f >> 13) & 0x03ff); // Mantissa + } + + GLM_FUNC_QUALIFIER glm::uint32 float2packed11(glm::uint32 f) + { + // 10 bits => EE EEEFFFFF + // 11 bits => EEE EEFFFFFF + // Half bits => SEEEEEFF FFFFFFFF + // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF + + // 0x000007c0 => 00000000 00000000 00000111 11000000 + // 0x00007c00 => 00000000 00000000 01111100 00000000 + // 0x000003ff => 00000000 00000000 00000011 11111111 + // 0x38000000 => 00111000 00000000 00000000 00000000 + // 0x7f800000 => 01111111 10000000 00000000 00000000 + // 0x00008000 => 00000000 00000000 10000000 00000000 + return + ((((f & 0x7f800000) - 0x38000000) >> 17) & 0x07c0) | // exponential + ((f >> 17) & 0x003f); // Mantissa + } + + GLM_FUNC_QUALIFIER glm::uint32 packed11ToFloat(glm::uint32 p) + { + // 10 bits => EE EEEFFFFF + // 11 bits => EEE EEFFFFFF + // Half bits => SEEEEEFF FFFFFFFF + // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF + + // 0x000007c0 => 00000000 00000000 00000111 11000000 + // 0x00007c00 => 00000000 00000000 01111100 00000000 + // 0x000003ff => 00000000 00000000 00000011 11111111 + // 0x38000000 => 00111000 00000000 00000000 00000000 + // 0x7f800000 => 01111111 10000000 00000000 00000000 + // 0x00008000 => 00000000 00000000 10000000 00000000 + return + ((((p & 0x07c0) << 17) + 0x38000000) & 0x7f800000) | // exponential + ((p & 0x003f) << 17); // Mantissa + } + + GLM_FUNC_QUALIFIER glm::uint32 float2packed10(glm::uint32 f) + { + // 10 bits => EE EEEFFFFF + // 11 bits => EEE EEFFFFFF + // Half bits => SEEEEEFF FFFFFFFF + // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF + + // 0x0000001F => 00000000 00000000 00000000 00011111 + // 0x0000003F => 00000000 00000000 00000000 00111111 + // 0x000003E0 => 00000000 00000000 00000011 11100000 + // 0x000007C0 => 00000000 00000000 00000111 11000000 + // 0x00007C00 => 00000000 00000000 01111100 00000000 + // 0x000003FF => 00000000 00000000 00000011 11111111 + // 0x38000000 => 00111000 00000000 00000000 00000000 + // 0x7f800000 => 01111111 10000000 00000000 00000000 + // 0x00008000 => 00000000 00000000 10000000 00000000 + return + ((((f & 0x7f800000) - 0x38000000) >> 18) & 0x03E0) | // exponential + ((f >> 18) & 0x001f); // Mantissa + } + + GLM_FUNC_QUALIFIER glm::uint32 packed10ToFloat(glm::uint32 p) + { + // 10 bits => EE EEEFFFFF + // 11 bits => EEE EEFFFFFF + // Half bits => SEEEEEFF FFFFFFFF + // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF + + // 0x0000001F => 00000000 00000000 00000000 00011111 + // 0x0000003F => 00000000 00000000 00000000 00111111 + // 0x000003E0 => 00000000 00000000 00000011 11100000 + // 0x000007C0 => 00000000 00000000 00000111 11000000 + // 0x00007C00 => 00000000 00000000 01111100 00000000 + // 0x000003FF => 00000000 00000000 00000011 11111111 + // 0x38000000 => 00111000 00000000 00000000 00000000 + // 0x7f800000 => 01111111 10000000 00000000 00000000 + // 0x00008000 => 00000000 00000000 10000000 00000000 + return + ((((p & 0x03E0) << 18) + 0x38000000) & 0x7f800000) | // exponential + ((p & 0x001f) << 18); // Mantissa + } + + GLM_FUNC_QUALIFIER glm::uint half2float(glm::uint h) + { + return ((h & 0x8000) << 16) | ((( h & 0x7c00) + 0x1C000) << 13) | ((h & 0x03FF) << 13); + } + + GLM_FUNC_QUALIFIER glm::uint floatTo11bit(float x) + { + if(x == 0.0f) + return 0u; + else if(glm::isnan(x)) + return ~0u; + else if(glm::isinf(x)) + return 0x1Fu << 6u; + + uint Pack = 0u; + memcpy(&Pack, &x, sizeof(Pack)); + return float2packed11(Pack); + } + + GLM_FUNC_QUALIFIER float packed11bitToFloat(glm::uint x) + { + if(x == 0) + return 0.0f; + else if(x == ((1 << 11) - 1)) + return ~0;//NaN + else if(x == (0x1f << 6)) + return ~0;//Inf + + uint Result = packed11ToFloat(x); + + float Temp = 0; + memcpy(&Temp, &Result, sizeof(Temp)); + return Temp; + } + + GLM_FUNC_QUALIFIER glm::uint floatTo10bit(float x) + { + if(x == 0.0f) + return 0u; + else if(glm::isnan(x)) + return ~0u; + else if(glm::isinf(x)) + return 0x1Fu << 5u; + + uint Pack = 0; + memcpy(&Pack, &x, sizeof(Pack)); + return float2packed10(Pack); + } + + GLM_FUNC_QUALIFIER float packed10bitToFloat(glm::uint x) + { + if(x == 0) + return 0.0f; + else if(x == ((1 << 10) - 1)) + return ~0;//NaN + else if(x == (0x1f << 5)) + return ~0;//Inf + + uint Result = packed10ToFloat(x); + + float Temp = 0; + memcpy(&Temp, &Result, sizeof(Temp)); + return Temp; + } + +// GLM_FUNC_QUALIFIER glm::uint f11_f11_f10(float x, float y, float z) +// { +// return ((floatTo11bit(x) & ((1 << 11) - 1)) << 0) | ((floatTo11bit(y) & ((1 << 11) - 1)) << 11) | ((floatTo10bit(z) & ((1 << 10) - 1)) << 22); +// } + + union u3u3u2 + { + struct + { + uint x : 3; + uint y : 3; + uint z : 2; + } data; + uint8 pack; + }; + + union u4u4 + { + struct + { + uint x : 4; + uint y : 4; + } data; + uint8 pack; + }; + + union u4u4u4u4 + { + struct + { + uint x : 4; + uint y : 4; + uint z : 4; + uint w : 4; + } data; + uint16 pack; + }; + + union u5u6u5 + { + struct + { + uint x : 5; + uint y : 6; + uint z : 5; + } data; + uint16 pack; + }; + + union u5u5u5u1 + { + struct + { + uint x : 5; + uint y : 5; + uint z : 5; + uint w : 1; + } data; + uint16 pack; + }; + + union u10u10u10u2 + { + struct + { + uint x : 10; + uint y : 10; + uint z : 10; + uint w : 2; + } data; + uint32 pack; + }; + + union i10i10i10i2 + { + struct + { + int x : 10; + int y : 10; + int z : 10; + int w : 2; + } data; + uint32 pack; + }; + + union u9u9u9e5 + { + struct + { + uint x : 9; + uint y : 9; + uint z : 9; + uint w : 5; + } data; + uint32 pack; + }; + + template + struct compute_half + {}; + + template + struct compute_half<1, Q> + { + GLM_FUNC_QUALIFIER static vec<1, uint16, Q> pack(vec<1, float, Q> const& v) + { + int16 const Unpack(detail::toFloat16(v.x)); + u16vec1 Packed; + memcpy(&Packed, &Unpack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER static vec<1, float, Q> unpack(vec<1, uint16, Q> const& v) + { + i16vec1 Unpack; + memcpy(&Unpack, &v, sizeof(Unpack)); + return vec<1, float, Q>(detail::toFloat32(v.x)); + } + }; + + template + struct compute_half<2, Q> + { + GLM_FUNC_QUALIFIER static vec<2, uint16, Q> pack(vec<2, float, Q> const& v) + { + vec<2, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y)); + u16vec2 Packed; + memcpy(&Packed, &Unpack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER static vec<2, float, Q> unpack(vec<2, uint16, Q> const& v) + { + i16vec2 Unpack; + memcpy(&Unpack, &v, sizeof(Unpack)); + return vec<2, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y)); + } + }; + + template + struct compute_half<3, Q> + { + GLM_FUNC_QUALIFIER static vec<3, uint16, Q> pack(vec<3, float, Q> const& v) + { + vec<3, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z)); + u16vec3 Packed; + memcpy(&Packed, &Unpack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER static vec<3, float, Q> unpack(vec<3, uint16, Q> const& v) + { + i16vec3 Unpack; + memcpy(&Unpack, &v, sizeof(Unpack)); + return vec<3, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z)); + } + }; + + template + struct compute_half<4, Q> + { + GLM_FUNC_QUALIFIER static vec<4, uint16, Q> pack(vec<4, float, Q> const& v) + { + vec<4, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z), detail::toFloat16(v.w)); + u16vec4 Packed; + memcpy(&Packed, &Unpack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER static vec<4, float, Q> unpack(vec<4, uint16, Q> const& v) + { + i16vec4 Unpack; + memcpy(&Unpack, &v, sizeof(Unpack)); + return vec<4, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z), detail::toFloat32(v.w)); + } + }; +}//namespace detail + + GLM_FUNC_QUALIFIER uint8 packUnorm1x8(float v) + { + return static_cast(round(clamp(v, 0.0f, 1.0f) * 255.0f)); + } + + GLM_FUNC_QUALIFIER float unpackUnorm1x8(uint8 p) + { + float const Unpack(p); + return Unpack * static_cast(0.0039215686274509803921568627451); // 1 / 255 + } + + GLM_FUNC_QUALIFIER uint16 packUnorm2x8(vec2 const& v) + { + u8vec2 const Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f)); + + uint16 Unpack = 0; + memcpy(&Unpack, &Topack, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER vec2 unpackUnorm2x8(uint16 p) + { + u8vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return vec2(Unpack) * float(0.0039215686274509803921568627451); // 1 / 255 + } + + GLM_FUNC_QUALIFIER uint8 packSnorm1x8(float v) + { + int8 const Topack(static_cast(round(clamp(v ,-1.0f, 1.0f) * 127.0f))); + uint8 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER float unpackSnorm1x8(uint8 p) + { + int8 Unpack = 0; + memcpy(&Unpack, &p, sizeof(Unpack)); + return clamp( + static_cast(Unpack) * 0.00787401574803149606299212598425f, // 1.0f / 127.0f + -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint16 packSnorm2x8(vec2 const& v) + { + i8vec2 const Topack(round(clamp(v, -1.0f, 1.0f) * 127.0f)); + uint16 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER vec2 unpackSnorm2x8(uint16 p) + { + i8vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return clamp( + vec2(Unpack) * 0.00787401574803149606299212598425f, // 1.0f / 127.0f + -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint16 packUnorm1x16(float s) + { + return static_cast(round(clamp(s, 0.0f, 1.0f) * 65535.0f)); + } + + GLM_FUNC_QUALIFIER float unpackUnorm1x16(uint16 p) + { + float const Unpack(p); + return Unpack * 1.5259021896696421759365224689097e-5f; // 1.0 / 65535.0 + } + + GLM_FUNC_QUALIFIER uint64 packUnorm4x16(vec4 const& v) + { + u16vec4 const Topack(round(clamp(v , 0.0f, 1.0f) * 65535.0f)); + uint64 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER vec4 unpackUnorm4x16(uint64 p) + { + u16vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return vec4(Unpack) * 1.5259021896696421759365224689097e-5f; // 1.0 / 65535.0 + } + + GLM_FUNC_QUALIFIER uint16 packSnorm1x16(float v) + { + int16 const Topack = static_cast(round(clamp(v ,-1.0f, 1.0f) * 32767.0f)); + uint16 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER float unpackSnorm1x16(uint16 p) + { + int16 Unpack = 0; + memcpy(&Unpack, &p, sizeof(Unpack)); + return clamp( + static_cast(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f, + -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint64 packSnorm4x16(vec4 const& v) + { + i16vec4 const Topack(round(clamp(v ,-1.0f, 1.0f) * 32767.0f)); + uint64 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER vec4 unpackSnorm4x16(uint64 p) + { + i16vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return clamp( + vec4(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f, + -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint16 packHalf1x16(float v) + { + int16 const Topack(detail::toFloat16(v)); + uint16 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER float unpackHalf1x16(uint16 v) + { + int16 Unpack = 0; + memcpy(&Unpack, &v, sizeof(Unpack)); + return detail::toFloat32(Unpack); + } + + GLM_FUNC_QUALIFIER uint64 packHalf4x16(glm::vec4 const& v) + { + i16vec4 const Unpack( + detail::toFloat16(v.x), + detail::toFloat16(v.y), + detail::toFloat16(v.z), + detail::toFloat16(v.w)); + uint64 Packed = 0; + memcpy(&Packed, &Unpack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER glm::vec4 unpackHalf4x16(uint64 v) + { + i16vec4 Unpack; + memcpy(&Unpack, &v, sizeof(Unpack)); + return vec4( + detail::toFloat32(Unpack.x), + detail::toFloat32(Unpack.y), + detail::toFloat32(Unpack.z), + detail::toFloat32(Unpack.w)); + } + + GLM_FUNC_QUALIFIER uint32 packI3x10_1x2(ivec4 const& v) + { + detail::i10i10i10i2 Result; + Result.data.x = v.x; + Result.data.y = v.y; + Result.data.z = v.z; + Result.data.w = v.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER ivec4 unpackI3x10_1x2(uint32 v) + { + detail::i10i10i10i2 Unpack; + Unpack.pack = v; + return ivec4( + Unpack.data.x, + Unpack.data.y, + Unpack.data.z, + Unpack.data.w); + } + + GLM_FUNC_QUALIFIER uint32 packU3x10_1x2(uvec4 const& v) + { + detail::u10u10u10u2 Result; + Result.data.x = v.x; + Result.data.y = v.y; + Result.data.z = v.z; + Result.data.w = v.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER uvec4 unpackU3x10_1x2(uint32 v) + { + detail::u10u10u10u2 Unpack; + Unpack.pack = v; + return uvec4( + Unpack.data.x, + Unpack.data.y, + Unpack.data.z, + Unpack.data.w); + } + + GLM_FUNC_QUALIFIER uint32 packSnorm3x10_1x2(vec4 const& v) + { + ivec4 const Pack(round(clamp(v,-1.0f, 1.0f) * vec4(511.f, 511.f, 511.f, 1.f))); + + detail::i10i10i10i2 Result; + Result.data.x = Pack.x; + Result.data.y = Pack.y; + Result.data.z = Pack.z; + Result.data.w = Pack.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec4 unpackSnorm3x10_1x2(uint32 v) + { + detail::i10i10i10i2 Unpack; + Unpack.pack = v; + + vec4 const Result(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w); + + return clamp(Result * vec4(1.f / 511.f, 1.f / 511.f, 1.f / 511.f, 1.f), -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint32 packUnorm3x10_1x2(vec4 const& v) + { + uvec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec4(1023.f, 1023.f, 1023.f, 3.f))); + + detail::u10u10u10u2 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + Result.data.z = Unpack.z; + Result.data.w = Unpack.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec4 unpackUnorm3x10_1x2(uint32 v) + { + vec4 const ScaleFactors(1.0f / 1023.f, 1.0f / 1023.f, 1.0f / 1023.f, 1.0f / 3.f); + + detail::u10u10u10u2 Unpack; + Unpack.pack = v; + return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactors; + } + + GLM_FUNC_QUALIFIER uint32 packF2x11_1x10(vec3 const& v) + { + return + ((detail::floatTo11bit(v.x) & ((1 << 11) - 1)) << 0) | + ((detail::floatTo11bit(v.y) & ((1 << 11) - 1)) << 11) | + ((detail::floatTo10bit(v.z) & ((1 << 10) - 1)) << 22); + } + + GLM_FUNC_QUALIFIER vec3 unpackF2x11_1x10(uint32 v) + { + return vec3( + detail::packed11bitToFloat(v >> 0), + detail::packed11bitToFloat(v >> 11), + detail::packed10bitToFloat(v >> 22)); + } + + GLM_FUNC_QUALIFIER uint32 packF3x9_E1x5(vec3 const& v) + { + float const SharedExpMax = (pow(2.0f, 9.0f - 1.0f) / pow(2.0f, 9.0f)) * pow(2.0f, 31.f - 15.f); + vec3 const Color = clamp(v, 0.0f, SharedExpMax); + float const MaxColor = max(Color.x, max(Color.y, Color.z)); + + float const ExpSharedP = max(-15.f - 1.f, floor(log2(MaxColor))) + 1.0f + 15.f; + float const MaxShared = floor(MaxColor / pow(2.0f, (ExpSharedP - 15.f - 9.f)) + 0.5f); + float const ExpShared = equal(MaxShared, pow(2.0f, 9.0f), epsilon()) ? ExpSharedP + 1.0f : ExpSharedP; + + uvec3 const ColorComp(floor(Color / pow(2.f, (ExpShared - 15.f - 9.f)) + 0.5f)); + + detail::u9u9u9e5 Unpack; + Unpack.data.x = ColorComp.x; + Unpack.data.y = ColorComp.y; + Unpack.data.z = ColorComp.z; + Unpack.data.w = uint(ExpShared); + return Unpack.pack; + } + + GLM_FUNC_QUALIFIER vec3 unpackF3x9_E1x5(uint32 v) + { + detail::u9u9u9e5 Unpack; + Unpack.pack = v; + + return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * pow(2.0f, Unpack.data.w - 15.f - 9.f); + } + + // Based on Brian Karis http://graphicrants.blogspot.fr/2009/04/rgbm-color-encoding.html + template + GLM_FUNC_QUALIFIER vec<4, T, Q> packRGBM(vec<3, T, Q> const& rgb) + { + vec<3, T, Q> const Color(rgb * static_cast(1.0 / 6.0)); + T Alpha = clamp(max(max(Color.x, Color.y), max(Color.z, static_cast(1e-6))), static_cast(0), static_cast(1)); + Alpha = ceil(Alpha * static_cast(255.0)) / static_cast(255.0); + return vec<4, T, Q>(Color / Alpha, Alpha); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& rgbm) + { + return vec<3, T, Q>(rgbm.x, rgbm.y, rgbm.z) * rgbm.w * static_cast(6); + } + + template + GLM_FUNC_QUALIFIER vec packHalf(vec const& v) + { + return detail::compute_half::pack(v); + } + + template + GLM_FUNC_QUALIFIER vec unpackHalf(vec const& v) + { + return detail::compute_half::unpack(v); + } + + template + GLM_FUNC_QUALIFIER vec packUnorm(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "uintType must be an integer type"); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "floatType must be a floating point type"); + + return vec(round(clamp(v, static_cast(0), static_cast(1)) * static_cast(std::numeric_limits::max()))); + } + + template + GLM_FUNC_QUALIFIER vec unpackUnorm(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "uintType must be an integer type"); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "floatType must be a floating point type"); + + return vec(v) * (static_cast(1) / static_cast(std::numeric_limits::max())); + } + + template + GLM_FUNC_QUALIFIER vec packSnorm(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "uintType must be an integer type"); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "floatType must be a floating point type"); + + return vec(round(clamp(v , static_cast(-1), static_cast(1)) * static_cast(std::numeric_limits::max()))); + } + + template + GLM_FUNC_QUALIFIER vec unpackSnorm(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "uintType must be an integer type"); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "floatType must be a floating point type"); + + return clamp(vec(v) * (static_cast(1) / static_cast(std::numeric_limits::max())), static_cast(-1), static_cast(1)); + } + + GLM_FUNC_QUALIFIER uint8 packUnorm2x4(vec2 const& v) + { + u32vec2 const Unpack(round(clamp(v, 0.0f, 1.0f) * 15.0f)); + detail::u4u4 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec2 unpackUnorm2x4(uint8 v) + { + float const ScaleFactor(1.f / 15.f); + detail::u4u4 Unpack; + Unpack.pack = v; + return vec2(Unpack.data.x, Unpack.data.y) * ScaleFactor; + } + + GLM_FUNC_QUALIFIER uint16 packUnorm4x4(vec4 const& v) + { + u32vec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * 15.0f)); + detail::u4u4u4u4 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + Result.data.z = Unpack.z; + Result.data.w = Unpack.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec4 unpackUnorm4x4(uint16 v) + { + float const ScaleFactor(1.f / 15.f); + detail::u4u4u4u4 Unpack; + Unpack.pack = v; + return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactor; + } + + GLM_FUNC_QUALIFIER uint16 packUnorm1x5_1x6_1x5(vec3 const& v) + { + u32vec3 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec3(31.f, 63.f, 31.f))); + detail::u5u6u5 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + Result.data.z = Unpack.z; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec3 unpackUnorm1x5_1x6_1x5(uint16 v) + { + vec3 const ScaleFactor(1.f / 31.f, 1.f / 63.f, 1.f / 31.f); + detail::u5u6u5 Unpack; + Unpack.pack = v; + return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * ScaleFactor; + } + + GLM_FUNC_QUALIFIER uint16 packUnorm3x5_1x1(vec4 const& v) + { + u32vec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec4(31.f, 31.f, 31.f, 1.f))); + detail::u5u5u5u1 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + Result.data.z = Unpack.z; + Result.data.w = Unpack.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec4 unpackUnorm3x5_1x1(uint16 v) + { + vec4 const ScaleFactor(1.f / 31.f, 1.f / 31.f, 1.f / 31.f, 1.f); + detail::u5u5u5u1 Unpack; + Unpack.pack = v; + return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactor; + } + + GLM_FUNC_QUALIFIER uint8 packUnorm2x3_1x2(vec3 const& v) + { + u32vec3 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec3(7.f, 7.f, 3.f))); + detail::u3u3u2 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + Result.data.z = Unpack.z; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec3 unpackUnorm2x3_1x2(uint8 v) + { + vec3 const ScaleFactor(1.f / 7.f, 1.f / 7.f, 1.f / 3.f); + detail::u3u3u2 Unpack; + Unpack.pack = v; + return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * ScaleFactor; + } + + GLM_FUNC_QUALIFIER int16 packInt2x8(i8vec2 const& v) + { + int16 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i8vec2 unpackInt2x8(int16 p) + { + i8vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint16 packUint2x8(u8vec2 const& v) + { + uint16 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u8vec2 unpackUint2x8(uint16 p) + { + u8vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int32 packInt4x8(i8vec4 const& v) + { + int32 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i8vec4 unpackInt4x8(int32 p) + { + i8vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint32 packUint4x8(u8vec4 const& v) + { + uint32 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u8vec4 unpackUint4x8(uint32 p) + { + u8vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int packInt2x16(i16vec2 const& v) + { + int Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i16vec2 unpackInt2x16(int p) + { + i16vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int64 packInt4x16(i16vec4 const& v) + { + int64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i16vec4 unpackInt4x16(int64 p) + { + i16vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint packUint2x16(u16vec2 const& v) + { + uint Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u16vec2 unpackUint2x16(uint p) + { + u16vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint64 packUint4x16(u16vec4 const& v) + { + uint64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u16vec4 unpackUint4x16(uint64 p) + { + u16vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int64 packInt2x32(i32vec2 const& v) + { + int64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i32vec2 unpackInt2x32(int64 p) + { + i32vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint64 packUint2x32(u32vec2 const& v) + { + uint64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u32vec2 unpackUint2x32(uint64 p) + { + u32vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/gtc/quaternion.hpp b/NothinFancy/dep/include/glm/gtc/quaternion.hpp new file mode 100644 index 0000000..359e072 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/quaternion.hpp @@ -0,0 +1,173 @@ +/// @ref gtc_quaternion +/// @file glm/gtc/quaternion.hpp +/// +/// @see core (dependence) +/// @see gtc_constants (dependence) +/// +/// @defgroup gtc_quaternion GLM_GTC_quaternion +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines a templated quaternion type and several quaternion operations. + +#pragma once + +// Dependency: +#include "../gtc/constants.hpp" +#include "../gtc/matrix_transform.hpp" +#include "../ext/vector_relational.hpp" +#include "../ext/quaternion_common.hpp" +#include "../ext/quaternion_float.hpp" +#include "../ext/quaternion_float_precision.hpp" +#include "../ext/quaternion_double.hpp" +#include "../ext/quaternion_double_precision.hpp" +#include "../ext/quaternion_relational.hpp" +#include "../ext/quaternion_geometric.hpp" +#include "../ext/quaternion_trigonometric.hpp" +#include "../ext/quaternion_transform.hpp" +#include "../detail/type_mat3x3.hpp" +#include "../detail/type_mat4x4.hpp" +#include "../detail/type_vec3.hpp" +#include "../detail/type_vec4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_quaternion extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_quaternion + /// @{ + + /// Returns euler angles, pitch as x, yaw as y, roll as z. + /// The result is expressed in radians. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL vec<3, T, Q> eulerAngles(qua const& x); + + /// Returns roll value of euler angles expressed in radians. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL T roll(qua const& x); + + /// Returns pitch value of euler angles expressed in radians. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL T pitch(qua const& x); + + /// Returns yaw value of euler angles expressed in radians. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL T yaw(qua const& x); + + /// Converts a quaternion to a 3 * 3 matrix. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL mat<3, 3, T, Q> mat3_cast(qua const& x); + + /// Converts a quaternion to a 4 * 4 matrix. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL mat<4, 4, T, Q> mat4_cast(qua const& x); + + /// Converts a pure rotation 3 * 3 matrix to a quaternion. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL qua quat_cast(mat<3, 3, T, Q> const& x); + + /// Converts a pure rotation 4 * 4 matrix to a quaternion. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL qua quat_cast(mat<4, 4, T, Q> const& x); + + /// Returns the component-wise comparison result of x < y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_relational + template + GLM_FUNC_DECL vec<4, bool, Q> lessThan(qua const& x, qua const& y); + + /// Returns the component-wise comparison of result x <= y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_relational + template + GLM_FUNC_DECL vec<4, bool, Q> lessThanEqual(qua const& x, qua const& y); + + /// Returns the component-wise comparison of result x > y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_relational + template + GLM_FUNC_DECL vec<4, bool, Q> greaterThan(qua const& x, qua const& y); + + /// Returns the component-wise comparison of result x >= y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_relational + template + GLM_FUNC_DECL vec<4, bool, Q> greaterThanEqual(qua const& x, qua const& y); + + /// Build a look at quaternion based on the default handedness. + /// + /// @param direction Desired forward direction. Needs to be normalized. + /// @param up Up vector, how the camera is oriented. Typically (0, 1, 0). + template + GLM_FUNC_DECL qua quatLookAt( + vec<3, T, Q> const& direction, + vec<3, T, Q> const& up); + + /// Build a right-handed look at quaternion. + /// + /// @param direction Desired forward direction onto which the -z-axis gets mapped. Needs to be normalized. + /// @param up Up vector, how the camera is oriented. Typically (0, 1, 0). + template + GLM_FUNC_DECL qua quatLookAtRH( + vec<3, T, Q> const& direction, + vec<3, T, Q> const& up); + + /// Build a left-handed look at quaternion. + /// + /// @param direction Desired forward direction onto which the +z-axis gets mapped. Needs to be normalized. + /// @param up Up vector, how the camera is oriented. Typically (0, 1, 0). + template + GLM_FUNC_DECL qua quatLookAtLH( + vec<3, T, Q> const& direction, + vec<3, T, Q> const& up); + /// @} +} //namespace glm + +#include "quaternion.inl" diff --git a/NothinFancy/dep/include/glm/gtc/quaternion.inl b/NothinFancy/dep/include/glm/gtc/quaternion.inl new file mode 100644 index 0000000..06f9f02 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/quaternion.inl @@ -0,0 +1,202 @@ +#include "../trigonometric.hpp" +#include "../geometric.hpp" +#include "../exponential.hpp" +#include "epsilon.hpp" +#include + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> eulerAngles(qua const& x) + { + return vec<3, T, Q>(pitch(x), yaw(x), roll(x)); + } + + template + GLM_FUNC_QUALIFIER T roll(qua const& q) + { + return static_cast(atan(static_cast(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z)); + } + + template + GLM_FUNC_QUALIFIER T pitch(qua const& q) + { + //return T(atan(T(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z)); + T const y = static_cast(2) * (q.y * q.z + q.w * q.x); + T const x = q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z; + + if(all(equal(vec<2, T, Q>(x, y), vec<2, T, Q>(0), epsilon()))) //avoid atan2(0,0) - handle singularity - Matiis + return static_cast(static_cast(2) * atan(q.x, q.w)); + + return static_cast(atan(y, x)); + } + + template + GLM_FUNC_QUALIFIER T yaw(qua const& q) + { + return asin(clamp(static_cast(-2) * (q.x * q.z - q.w * q.y), static_cast(-1), static_cast(1))); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat3_cast(qua const& q) + { + mat<3, 3, T, Q> Result(T(1)); + T qxx(q.x * q.x); + T qyy(q.y * q.y); + T qzz(q.z * q.z); + T qxz(q.x * q.z); + T qxy(q.x * q.y); + T qyz(q.y * q.z); + T qwx(q.w * q.x); + T qwy(q.w * q.y); + T qwz(q.w * q.z); + + Result[0][0] = T(1) - T(2) * (qyy + qzz); + Result[0][1] = T(2) * (qxy + qwz); + Result[0][2] = T(2) * (qxz - qwy); + + Result[1][0] = T(2) * (qxy - qwz); + Result[1][1] = T(1) - T(2) * (qxx + qzz); + Result[1][2] = T(2) * (qyz + qwx); + + Result[2][0] = T(2) * (qxz + qwy); + Result[2][1] = T(2) * (qyz - qwx); + Result[2][2] = T(1) - T(2) * (qxx + qyy); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat4_cast(qua const& q) + { + return mat<4, 4, T, Q>(mat3_cast(q)); + } + + template + GLM_FUNC_QUALIFIER qua quat_cast(mat<3, 3, T, Q> const& m) + { + T fourXSquaredMinus1 = m[0][0] - m[1][1] - m[2][2]; + T fourYSquaredMinus1 = m[1][1] - m[0][0] - m[2][2]; + T fourZSquaredMinus1 = m[2][2] - m[0][0] - m[1][1]; + T fourWSquaredMinus1 = m[0][0] + m[1][1] + m[2][2]; + + int biggestIndex = 0; + T fourBiggestSquaredMinus1 = fourWSquaredMinus1; + if(fourXSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourXSquaredMinus1; + biggestIndex = 1; + } + if(fourYSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourYSquaredMinus1; + biggestIndex = 2; + } + if(fourZSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourZSquaredMinus1; + biggestIndex = 3; + } + + T biggestVal = sqrt(fourBiggestSquaredMinus1 + static_cast(1)) * static_cast(0.5); + T mult = static_cast(0.25) / biggestVal; + + switch(biggestIndex) + { + case 0: + return qua(biggestVal, (m[1][2] - m[2][1]) * mult, (m[2][0] - m[0][2]) * mult, (m[0][1] - m[1][0]) * mult); + case 1: + return qua((m[1][2] - m[2][1]) * mult, biggestVal, (m[0][1] + m[1][0]) * mult, (m[2][0] + m[0][2]) * mult); + case 2: + return qua((m[2][0] - m[0][2]) * mult, (m[0][1] + m[1][0]) * mult, biggestVal, (m[1][2] + m[2][1]) * mult); + case 3: + return qua((m[0][1] - m[1][0]) * mult, (m[2][0] + m[0][2]) * mult, (m[1][2] + m[2][1]) * mult, biggestVal); + default: // Silence a -Wswitch-default warning in GCC. Should never actually get here. Assert is just for sanity. + assert(false); + return qua(1, 0, 0, 0); + } + } + + template + GLM_FUNC_QUALIFIER qua quat_cast(mat<4, 4, T, Q> const& m4) + { + return quat_cast(mat<3, 3, T, Q>(m4)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThan(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] < y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThanEqual(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] <= y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThan(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] > y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThanEqual(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] >= y[i]; + return Result; + } + + + template + GLM_FUNC_QUALIFIER qua quatLookAt(vec<3, T, Q> const& direction, vec<3, T, Q> const& up) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return quatLookAtLH(direction, up); +# else + return quatLookAtRH(direction, up); +# endif + } + + template + GLM_FUNC_QUALIFIER qua quatLookAtRH(vec<3, T, Q> const& direction, vec<3, T, Q> const& up) + { + mat<3, 3, T, Q> Result; + + Result[2] = -direction; + vec<3, T, Q> const& Right = cross(up, Result[2]); + Result[0] = Right * inversesqrt(max(static_cast(0.00001), dot(Right, Right))); + Result[1] = cross(Result[2], Result[0]); + + return quat_cast(Result); + } + + template + GLM_FUNC_QUALIFIER qua quatLookAtLH(vec<3, T, Q> const& direction, vec<3, T, Q> const& up) + { + mat<3, 3, T, Q> Result; + + Result[2] = direction; + vec<3, T, Q> const& Right = cross(up, Result[2]); + Result[0] = Right * inversesqrt(max(static_cast(0.00001), dot(Right, Right))); + Result[1] = cross(Result[2], Result[0]); + + return quat_cast(Result); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "quaternion_simd.inl" +#endif + diff --git a/NothinFancy/dep/include/glm/gtc/quaternion_simd.inl b/NothinFancy/dep/include/glm/gtc/quaternion_simd.inl new file mode 100644 index 0000000..e69de29 diff --git a/NothinFancy/dep/include/glm/gtc/random.hpp b/NothinFancy/dep/include/glm/gtc/random.hpp new file mode 100644 index 0000000..9a85958 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/random.hpp @@ -0,0 +1,82 @@ +/// @ref gtc_random +/// @file glm/gtc/random.hpp +/// +/// @see core (dependence) +/// @see gtx_random (extended) +/// +/// @defgroup gtc_random GLM_GTC_random +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Generate random number from various distribution methods. + +#pragma once + +// Dependency: +#include "../ext/scalar_int_sized.hpp" +#include "../ext/scalar_uint_sized.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_random extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_random + /// @{ + + /// Generate random numbers in the interval [Min, Max], according a linear distribution + /// + /// @param Min Minimum value included in the sampling + /// @param Max Maximum value included in the sampling + /// @tparam genType Value type. Currently supported: float or double scalars. + /// @see gtc_random + template + GLM_FUNC_DECL genType linearRand(genType Min, genType Max); + + /// Generate random numbers in the interval [Min, Max], according a linear distribution + /// + /// @param Min Minimum value included in the sampling + /// @param Max Maximum value included in the sampling + /// @tparam T Value type. Currently supported: float or double. + /// + /// @see gtc_random + template + GLM_FUNC_DECL vec linearRand(vec const& Min, vec const& Max); + + /// Generate random numbers in the interval [Min, Max], according a gaussian distribution + /// + /// @see gtc_random + template + GLM_FUNC_DECL genType gaussRand(genType Mean, genType Deviation); + + /// Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius + /// + /// @see gtc_random + template + GLM_FUNC_DECL vec<2, T, defaultp> circularRand(T Radius); + + /// Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius + /// + /// @see gtc_random + template + GLM_FUNC_DECL vec<3, T, defaultp> sphericalRand(T Radius); + + /// Generate a random 2D vector which coordinates are regulary distributed within the area of a disk of a given radius + /// + /// @see gtc_random + template + GLM_FUNC_DECL vec<2, T, defaultp> diskRand(T Radius); + + /// Generate a random 3D vector which coordinates are regulary distributed within the volume of a ball of a given radius + /// + /// @see gtc_random + template + GLM_FUNC_DECL vec<3, T, defaultp> ballRand(T Radius); + + /// @} +}//namespace glm + +#include "random.inl" diff --git a/NothinFancy/dep/include/glm/gtc/random.inl b/NothinFancy/dep/include/glm/gtc/random.inl new file mode 100644 index 0000000..7048509 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/random.inl @@ -0,0 +1,303 @@ +#include "../geometric.hpp" +#include "../exponential.hpp" +#include "../trigonometric.hpp" +#include "../detail/type_vec1.hpp" +#include +#include +#include +#include + +namespace glm{ +namespace detail +{ + template + struct compute_rand + { + GLM_FUNC_QUALIFIER static vec call(); + }; + + template + struct compute_rand<1, uint8, P> + { + GLM_FUNC_QUALIFIER static vec<1, uint8, P> call() + { + return vec<1, uint8, P>( + std::rand() % std::numeric_limits::max()); + } + }; + + template + struct compute_rand<2, uint8, P> + { + GLM_FUNC_QUALIFIER static vec<2, uint8, P> call() + { + return vec<2, uint8, P>( + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max()); + } + }; + + template + struct compute_rand<3, uint8, P> + { + GLM_FUNC_QUALIFIER static vec<3, uint8, P> call() + { + return vec<3, uint8, P>( + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max()); + } + }; + + template + struct compute_rand<4, uint8, P> + { + GLM_FUNC_QUALIFIER static vec<4, uint8, P> call() + { + return vec<4, uint8, P>( + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max()); + } + }; + + template + struct compute_rand + { + GLM_FUNC_QUALIFIER static vec call() + { + return + (vec(compute_rand::call()) << static_cast(8)) | + (vec(compute_rand::call()) << static_cast(0)); + } + }; + + template + struct compute_rand + { + GLM_FUNC_QUALIFIER static vec call() + { + return + (vec(compute_rand::call()) << static_cast(16)) | + (vec(compute_rand::call()) << static_cast(0)); + } + }; + + template + struct compute_rand + { + GLM_FUNC_QUALIFIER static vec call() + { + return + (vec(compute_rand::call()) << static_cast(32)) | + (vec(compute_rand::call()) << static_cast(0)); + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max); + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (vec(compute_rand::call() % vec(Max + static_cast(1) - Min))) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (compute_rand::call() % (Max + static_cast(1) - Min)) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (vec(compute_rand::call() % vec(Max + static_cast(1) - Min))) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (compute_rand::call() % (Max + static_cast(1) - Min)) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (vec(compute_rand::call() % vec(Max + static_cast(1) - Min))) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (compute_rand::call() % (Max + static_cast(1) - Min)) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (vec(compute_rand::call() % vec(Max + static_cast(1) - Min))) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (compute_rand::call() % (Max + static_cast(1) - Min)) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return vec(compute_rand::call()) / static_cast(std::numeric_limits::max()) * (Max - Min) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return vec(compute_rand::call()) / static_cast(std::numeric_limits::max()) * (Max - Min) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return vec(compute_rand::call()) / static_cast(std::numeric_limits::max()) * (Max - Min) + Min; + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER genType linearRand(genType Min, genType Max) + { + return detail::compute_linearRand<1, genType, highp>::call( + vec<1, genType, highp>(Min), + vec<1, genType, highp>(Max)).x; + } + + template + GLM_FUNC_QUALIFIER vec linearRand(vec const& Min, vec const& Max) + { + return detail::compute_linearRand::call(Min, Max); + } + + template + GLM_FUNC_QUALIFIER genType gaussRand(genType Mean, genType Deviation) + { + genType w, x1, x2; + + do + { + x1 = linearRand(genType(-1), genType(1)); + x2 = linearRand(genType(-1), genType(1)); + + w = x1 * x1 + x2 * x2; + } while(w > genType(1)); + + return static_cast(x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean); + } + + template + GLM_FUNC_QUALIFIER vec gaussRand(vec const& Mean, vec const& Deviation) + { + return detail::functor2::call(gaussRand, Mean, Deviation); + } + + template + GLM_FUNC_QUALIFIER vec<2, T, defaultp> diskRand(T Radius) + { + assert(Radius > static_cast(0)); + + vec<2, T, defaultp> Result(T(0)); + T LenRadius(T(0)); + + do + { + Result = linearRand( + vec<2, T, defaultp>(-Radius), + vec<2, T, defaultp>(Radius)); + LenRadius = length(Result); + } + while(LenRadius > Radius); + + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, defaultp> ballRand(T Radius) + { + assert(Radius > static_cast(0)); + + vec<3, T, defaultp> Result(T(0)); + T LenRadius(T(0)); + + do + { + Result = linearRand( + vec<3, T, defaultp>(-Radius), + vec<3, T, defaultp>(Radius)); + LenRadius = length(Result); + } + while(LenRadius > Radius); + + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, defaultp> circularRand(T Radius) + { + assert(Radius > static_cast(0)); + + T a = linearRand(T(0), static_cast(6.283185307179586476925286766559)); + return vec<2, T, defaultp>(glm::cos(a), glm::sin(a)) * Radius; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, defaultp> sphericalRand(T Radius) + { + assert(Radius > static_cast(0)); + + T theta = linearRand(T(0), T(6.283185307179586476925286766559f)); + T phi = std::acos(linearRand(T(-1.0f), T(1.0f))); + + T x = std::sin(phi) * std::cos(theta); + T y = std::sin(phi) * std::sin(theta); + T z = std::cos(phi); + + return vec<3, T, defaultp>(x, y, z) * Radius; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/reciprocal.hpp b/NothinFancy/dep/include/glm/gtc/reciprocal.hpp new file mode 100644 index 0000000..c7d1330 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/reciprocal.hpp @@ -0,0 +1,135 @@ +/// @ref gtc_reciprocal +/// @file glm/gtc/reciprocal.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_reciprocal GLM_GTC_reciprocal +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Define secant, cosecant and cotangent functions. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_reciprocal extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_reciprocal + /// @{ + + /// Secant function. + /// hypotenuse / adjacent or 1 / cos(x) + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType sec(genType angle); + + /// Cosecant function. + /// hypotenuse / opposite or 1 / sin(x) + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType csc(genType angle); + + /// Cotangent function. + /// adjacent / opposite or 1 / tan(x) + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType cot(genType angle); + + /// Inverse secant function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType asec(genType x); + + /// Inverse cosecant function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType acsc(genType x); + + /// Inverse cotangent function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType acot(genType x); + + /// Secant hyperbolic function. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType sech(genType angle); + + /// Cosecant hyperbolic function. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType csch(genType angle); + + /// Cotangent hyperbolic function. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType coth(genType angle); + + /// Inverse secant hyperbolic function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType asech(genType x); + + /// Inverse cosecant hyperbolic function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType acsch(genType x); + + /// Inverse cotangent hyperbolic function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType acoth(genType x); + + /// @} +}//namespace glm + +#include "reciprocal.inl" diff --git a/NothinFancy/dep/include/glm/gtc/reciprocal.inl b/NothinFancy/dep/include/glm/gtc/reciprocal.inl new file mode 100644 index 0000000..d88729e --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/reciprocal.inl @@ -0,0 +1,191 @@ +/// @ref gtc_reciprocal + +#include "../trigonometric.hpp" +#include + +namespace glm +{ + // sec + template + GLM_FUNC_QUALIFIER genType sec(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'sec' only accept floating-point values"); + return genType(1) / glm::cos(angle); + } + + template + GLM_FUNC_QUALIFIER vec sec(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'sec' only accept floating-point inputs"); + return detail::functor1::call(sec, x); + } + + // csc + template + GLM_FUNC_QUALIFIER genType csc(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'csc' only accept floating-point values"); + return genType(1) / glm::sin(angle); + } + + template + GLM_FUNC_QUALIFIER vec csc(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'csc' only accept floating-point inputs"); + return detail::functor1::call(csc, x); + } + + // cot + template + GLM_FUNC_QUALIFIER genType cot(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'cot' only accept floating-point values"); + + genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0); + return glm::tan(pi_over_2 - angle); + } + + template + GLM_FUNC_QUALIFIER vec cot(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'cot' only accept floating-point inputs"); + return detail::functor1::call(cot, x); + } + + // asec + template + GLM_FUNC_QUALIFIER genType asec(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'asec' only accept floating-point values"); + return acos(genType(1) / x); + } + + template + GLM_FUNC_QUALIFIER vec asec(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'asec' only accept floating-point inputs"); + return detail::functor1::call(asec, x); + } + + // acsc + template + GLM_FUNC_QUALIFIER genType acsc(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acsc' only accept floating-point values"); + return asin(genType(1) / x); + } + + template + GLM_FUNC_QUALIFIER vec acsc(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acsc' only accept floating-point inputs"); + return detail::functor1::call(acsc, x); + } + + // acot + template + GLM_FUNC_QUALIFIER genType acot(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acot' only accept floating-point values"); + + genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0); + return pi_over_2 - atan(x); + } + + template + GLM_FUNC_QUALIFIER vec acot(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acot' only accept floating-point inputs"); + return detail::functor1::call(acot, x); + } + + // sech + template + GLM_FUNC_QUALIFIER genType sech(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'sech' only accept floating-point values"); + return genType(1) / glm::cosh(angle); + } + + template + GLM_FUNC_QUALIFIER vec sech(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'sech' only accept floating-point inputs"); + return detail::functor1::call(sech, x); + } + + // csch + template + GLM_FUNC_QUALIFIER genType csch(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'csch' only accept floating-point values"); + return genType(1) / glm::sinh(angle); + } + + template + GLM_FUNC_QUALIFIER vec csch(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'csch' only accept floating-point inputs"); + return detail::functor1::call(csch, x); + } + + // coth + template + GLM_FUNC_QUALIFIER genType coth(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'coth' only accept floating-point values"); + return glm::cosh(angle) / glm::sinh(angle); + } + + template + GLM_FUNC_QUALIFIER vec coth(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'coth' only accept floating-point inputs"); + return detail::functor1::call(coth, x); + } + + // asech + template + GLM_FUNC_QUALIFIER genType asech(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'asech' only accept floating-point values"); + return acosh(genType(1) / x); + } + + template + GLM_FUNC_QUALIFIER vec asech(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'asech' only accept floating-point inputs"); + return detail::functor1::call(asech, x); + } + + // acsch + template + GLM_FUNC_QUALIFIER genType acsch(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acsch' only accept floating-point values"); + return asinh(genType(1) / x); + } + + template + GLM_FUNC_QUALIFIER vec acsch(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acsch' only accept floating-point inputs"); + return detail::functor1::call(acsch, x); + } + + // acoth + template + GLM_FUNC_QUALIFIER genType acoth(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acoth' only accept floating-point values"); + return atanh(genType(1) / x); + } + + template + GLM_FUNC_QUALIFIER vec acoth(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acoth' only accept floating-point inputs"); + return detail::functor1::call(acoth, x); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/round.hpp b/NothinFancy/dep/include/glm/gtc/round.hpp new file mode 100644 index 0000000..56edbbc --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/round.hpp @@ -0,0 +1,160 @@ +/// @ref gtc_round +/// @file glm/gtc/round.hpp +/// +/// @see core (dependence) +/// @see gtc_round (dependence) +/// +/// @defgroup gtc_round GLM_GTC_round +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Rounding value to specific boundings + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_vectorize.hpp" +#include "../vector_relational.hpp" +#include "../common.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_round extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_round + /// @{ + + /// Return the power of two number which value is just higher the input value, + /// round up to a power of two. + /// + /// @see gtc_round + template + GLM_FUNC_DECL genIUType ceilPowerOfTwo(genIUType v); + + /// Return the power of two number which value is just higher the input value, + /// round up to a power of two. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec ceilPowerOfTwo(vec const& v); + + /// Return the power of two number which value is just lower the input value, + /// round down to a power of two. + /// + /// @see gtc_round + template + GLM_FUNC_DECL genIUType floorPowerOfTwo(genIUType v); + + /// Return the power of two number which value is just lower the input value, + /// round down to a power of two. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec floorPowerOfTwo(vec const& v); + + /// Return the power of two number which value is the closet to the input value. + /// + /// @see gtc_round + template + GLM_FUNC_DECL genIUType roundPowerOfTwo(genIUType v); + + /// Return the power of two number which value is the closet to the input value. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec roundPowerOfTwo(vec const& v); + + /// Higher multiple number of Source. + /// + /// @tparam genType Floating-point or integer scalar or vector types. + /// + /// @param v Source value to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL genType ceilMultiple(genType v, genType Multiple); + + /// Higher multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec ceilMultiple(vec const& v, vec const& Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam genType Floating-point or integer scalar or vector types. + /// + /// @param v Source value to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL genType floorMultiple(genType v, genType Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec floorMultiple(vec const& v, vec const& Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam genType Floating-point or integer scalar or vector types. + /// + /// @param v Source value to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL genType roundMultiple(genType v, genType Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec roundMultiple(vec const& v, vec const& Multiple); + + /// @} +} //namespace glm + +#include "round.inl" diff --git a/NothinFancy/dep/include/glm/gtc/round.inl b/NothinFancy/dep/include/glm/gtc/round.inl new file mode 100644 index 0000000..48411e4 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/round.inl @@ -0,0 +1,155 @@ +/// @ref gtc_round + +#include "../integer.hpp" +#include "../ext/vector_integer.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_roundMultiple {}; + + template<> + struct compute_roundMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if (Source >= genType(0)) + return Source - std::fmod(Source, Multiple); + else + { + genType Tmp = Source + genType(1); + return Tmp - std::fmod(Tmp, Multiple) - Multiple; + } + } + }; + + template<> + struct compute_roundMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if (Source >= genType(0)) + return Source - Source % Multiple; + else + { + genType Tmp = Source + genType(1); + return Tmp - Tmp % Multiple - Multiple; + } + } + }; + + template<> + struct compute_roundMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if (Source >= genType(0)) + return Source - Source % Multiple; + else + { + genType Tmp = Source + genType(1); + return Tmp - Tmp % Multiple - Multiple; + } + } + }; +}//namespace detail + + ////////////////// + // ceilPowerOfTwo + + template + GLM_FUNC_QUALIFIER genType ceilPowerOfTwo(genType value) + { + return detail::compute_ceilPowerOfTwo<1, genType, defaultp, std::numeric_limits::is_signed>::call(vec<1, genType, defaultp>(value)).x; + } + + template + GLM_FUNC_QUALIFIER vec ceilPowerOfTwo(vec const& v) + { + return detail::compute_ceilPowerOfTwo::is_signed>::call(v); + } + + /////////////////// + // floorPowerOfTwo + + template + GLM_FUNC_QUALIFIER genType floorPowerOfTwo(genType value) + { + return isPowerOfTwo(value) ? value : static_cast(1) << findMSB(value); + } + + template + GLM_FUNC_QUALIFIER vec floorPowerOfTwo(vec const& v) + { + return detail::functor1::call(floorPowerOfTwo, v); + } + + /////////////////// + // roundPowerOfTwo + + template + GLM_FUNC_QUALIFIER genIUType roundPowerOfTwo(genIUType value) + { + if(isPowerOfTwo(value)) + return value; + + genIUType const prev = static_cast(1) << findMSB(value); + genIUType const next = prev << static_cast(1); + return (next - value) < (value - prev) ? next : prev; + } + + template + GLM_FUNC_QUALIFIER vec roundPowerOfTwo(vec const& v) + { + return detail::functor1::call(roundPowerOfTwo, v); + } + + ////////////////////// + // ceilMultiple + + template + GLM_FUNC_QUALIFIER genType ceilMultiple(genType Source, genType Multiple) + { + return detail::compute_ceilMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER vec ceilMultiple(vec const& Source, vec const& Multiple) + { + return detail::functor2::call(ceilMultiple, Source, Multiple); + } + + ////////////////////// + // floorMultiple + + template + GLM_FUNC_QUALIFIER genType floorMultiple(genType Source, genType Multiple) + { + return detail::compute_floorMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER vec floorMultiple(vec const& Source, vec const& Multiple) + { + return detail::functor2::call(floorMultiple, Source, Multiple); + } + + ////////////////////// + // roundMultiple + + template + GLM_FUNC_QUALIFIER genType roundMultiple(genType Source, genType Multiple) + { + return detail::compute_roundMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER vec roundMultiple(vec const& Source, vec const& Multiple) + { + return detail::functor2::call(roundMultiple, Source, Multiple); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/type_aligned.hpp b/NothinFancy/dep/include/glm/gtc/type_aligned.hpp new file mode 100644 index 0000000..5403abf --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/type_aligned.hpp @@ -0,0 +1,1315 @@ +/// @ref gtc_type_aligned +/// @file glm/gtc/type_aligned.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_type_aligned GLM_GTC_type_aligned +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Aligned types allowing SIMD optimizations of vectors and matrices types + +#pragma once + +#if (GLM_CONFIG_ALIGNED_GENTYPES == GLM_DISABLE) +# error "GLM: Aligned gentypes require to enable C++ language extensions. Define GLM_FORCE_ALIGNED_GENTYPES before including GLM headers to use aligned types." +#endif + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_type_aligned extension included") +#endif + +#include "../mat4x4.hpp" +#include "../mat4x3.hpp" +#include "../mat4x2.hpp" +#include "../mat3x4.hpp" +#include "../mat3x3.hpp" +#include "../mat3x2.hpp" +#include "../mat2x4.hpp" +#include "../mat2x3.hpp" +#include "../mat2x2.hpp" +#include "../gtc/vec1.hpp" +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" + +namespace glm +{ + /// @addtogroup gtc_type_aligned + /// @{ + + // -- *vec1 -- + + /// 1 component vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, float, aligned_highp> aligned_highp_vec1; + + /// 1 component vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, float, aligned_mediump> aligned_mediump_vec1; + + /// 1 component vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, float, aligned_lowp> aligned_lowp_vec1; + + /// 1 component vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, double, aligned_highp> aligned_highp_dvec1; + + /// 1 component vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, double, aligned_mediump> aligned_mediump_dvec1; + + /// 1 component vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, double, aligned_lowp> aligned_lowp_dvec1; + + /// 1 component vector aligned in memory of signed integer numbers. + typedef vec<1, int, aligned_highp> aligned_highp_ivec1; + + /// 1 component vector aligned in memory of signed integer numbers. + typedef vec<1, int, aligned_mediump> aligned_mediump_ivec1; + + /// 1 component vector aligned in memory of signed integer numbers. + typedef vec<1, int, aligned_lowp> aligned_lowp_ivec1; + + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef vec<1, uint, aligned_highp> aligned_highp_uvec1; + + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef vec<1, uint, aligned_mediump> aligned_mediump_uvec1; + + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef vec<1, uint, aligned_lowp> aligned_lowp_uvec1; + + /// 1 component vector aligned in memory of bool values. + typedef vec<1, bool, aligned_highp> aligned_highp_bvec1; + + /// 1 component vector aligned in memory of bool values. + typedef vec<1, bool, aligned_mediump> aligned_mediump_bvec1; + + /// 1 component vector aligned in memory of bool values. + typedef vec<1, bool, aligned_lowp> aligned_lowp_bvec1; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, float, packed_highp> packed_highp_vec1; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, float, packed_mediump> packed_mediump_vec1; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, float, packed_lowp> packed_lowp_vec1; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, double, packed_highp> packed_highp_dvec1; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, double, packed_mediump> packed_mediump_dvec1; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, double, packed_lowp> packed_lowp_dvec1; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef vec<1, int, packed_highp> packed_highp_ivec1; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef vec<1, int, packed_mediump> packed_mediump_ivec1; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef vec<1, int, packed_lowp> packed_lowp_ivec1; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef vec<1, uint, packed_highp> packed_highp_uvec1; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef vec<1, uint, packed_mediump> packed_mediump_uvec1; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef vec<1, uint, packed_lowp> packed_lowp_uvec1; + + /// 1 component vector tightly packed in memory of bool values. + typedef vec<1, bool, packed_highp> packed_highp_bvec1; + + /// 1 component vector tightly packed in memory of bool values. + typedef vec<1, bool, packed_mediump> packed_mediump_bvec1; + + /// 1 component vector tightly packed in memory of bool values. + typedef vec<1, bool, packed_lowp> packed_lowp_bvec1; + + // -- *vec2 -- + + /// 2 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, float, aligned_highp> aligned_highp_vec2; + + /// 2 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, float, aligned_mediump> aligned_mediump_vec2; + + /// 2 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, float, aligned_lowp> aligned_lowp_vec2; + + /// 2 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, double, aligned_highp> aligned_highp_dvec2; + + /// 2 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, double, aligned_mediump> aligned_mediump_dvec2; + + /// 2 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, double, aligned_lowp> aligned_lowp_dvec2; + + /// 2 components vector aligned in memory of signed integer numbers. + typedef vec<2, int, aligned_highp> aligned_highp_ivec2; + + /// 2 components vector aligned in memory of signed integer numbers. + typedef vec<2, int, aligned_mediump> aligned_mediump_ivec2; + + /// 2 components vector aligned in memory of signed integer numbers. + typedef vec<2, int, aligned_lowp> aligned_lowp_ivec2; + + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef vec<2, uint, aligned_highp> aligned_highp_uvec2; + + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef vec<2, uint, aligned_mediump> aligned_mediump_uvec2; + + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef vec<2, uint, aligned_lowp> aligned_lowp_uvec2; + + /// 2 components vector aligned in memory of bool values. + typedef vec<2, bool, aligned_highp> aligned_highp_bvec2; + + /// 2 components vector aligned in memory of bool values. + typedef vec<2, bool, aligned_mediump> aligned_mediump_bvec2; + + /// 2 components vector aligned in memory of bool values. + typedef vec<2, bool, aligned_lowp> aligned_lowp_bvec2; + + /// 2 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, float, packed_highp> packed_highp_vec2; + + /// 2 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, float, packed_mediump> packed_mediump_vec2; + + /// 2 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, float, packed_lowp> packed_lowp_vec2; + + /// 2 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, double, packed_highp> packed_highp_dvec2; + + /// 2 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, double, packed_mediump> packed_mediump_dvec2; + + /// 2 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, double, packed_lowp> packed_lowp_dvec2; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef vec<2, int, packed_highp> packed_highp_ivec2; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef vec<2, int, packed_mediump> packed_mediump_ivec2; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef vec<2, int, packed_lowp> packed_lowp_ivec2; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<2, uint, packed_highp> packed_highp_uvec2; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<2, uint, packed_mediump> packed_mediump_uvec2; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<2, uint, packed_lowp> packed_lowp_uvec2; + + /// 2 components vector tightly packed in memory of bool values. + typedef vec<2, bool, packed_highp> packed_highp_bvec2; + + /// 2 components vector tightly packed in memory of bool values. + typedef vec<2, bool, packed_mediump> packed_mediump_bvec2; + + /// 2 components vector tightly packed in memory of bool values. + typedef vec<2, bool, packed_lowp> packed_lowp_bvec2; + + // -- *vec3 -- + + /// 3 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, float, aligned_highp> aligned_highp_vec3; + + /// 3 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, float, aligned_mediump> aligned_mediump_vec3; + + /// 3 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, float, aligned_lowp> aligned_lowp_vec3; + + /// 3 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, double, aligned_highp> aligned_highp_dvec3; + + /// 3 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, double, aligned_mediump> aligned_mediump_dvec3; + + /// 3 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, double, aligned_lowp> aligned_lowp_dvec3; + + /// 3 components vector aligned in memory of signed integer numbers. + typedef vec<3, int, aligned_highp> aligned_highp_ivec3; + + /// 3 components vector aligned in memory of signed integer numbers. + typedef vec<3, int, aligned_mediump> aligned_mediump_ivec3; + + /// 3 components vector aligned in memory of signed integer numbers. + typedef vec<3, int, aligned_lowp> aligned_lowp_ivec3; + + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef vec<3, uint, aligned_highp> aligned_highp_uvec3; + + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef vec<3, uint, aligned_mediump> aligned_mediump_uvec3; + + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef vec<3, uint, aligned_lowp> aligned_lowp_uvec3; + + /// 3 components vector aligned in memory of bool values. + typedef vec<3, bool, aligned_highp> aligned_highp_bvec3; + + /// 3 components vector aligned in memory of bool values. + typedef vec<3, bool, aligned_mediump> aligned_mediump_bvec3; + + /// 3 components vector aligned in memory of bool values. + typedef vec<3, bool, aligned_lowp> aligned_lowp_bvec3; + + /// 3 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, float, packed_highp> packed_highp_vec3; + + /// 3 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, float, packed_mediump> packed_mediump_vec3; + + /// 3 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, float, packed_lowp> packed_lowp_vec3; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, double, packed_highp> packed_highp_dvec3; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, double, packed_mediump> packed_mediump_dvec3; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, double, packed_lowp> packed_lowp_dvec3; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef vec<3, int, packed_highp> packed_highp_ivec3; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef vec<3, int, packed_mediump> packed_mediump_ivec3; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef vec<3, int, packed_lowp> packed_lowp_ivec3; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<3, uint, packed_highp> packed_highp_uvec3; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<3, uint, packed_mediump> packed_mediump_uvec3; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<3, uint, packed_lowp> packed_lowp_uvec3; + + /// 3 components vector tightly packed in memory of bool values. + typedef vec<3, bool, packed_highp> packed_highp_bvec3; + + /// 3 components vector tightly packed in memory of bool values. + typedef vec<3, bool, packed_mediump> packed_mediump_bvec3; + + /// 3 components vector tightly packed in memory of bool values. + typedef vec<3, bool, packed_lowp> packed_lowp_bvec3; + + // -- *vec4 -- + + /// 4 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, float, aligned_highp> aligned_highp_vec4; + + /// 4 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, float, aligned_mediump> aligned_mediump_vec4; + + /// 4 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, float, aligned_lowp> aligned_lowp_vec4; + + /// 4 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, double, aligned_highp> aligned_highp_dvec4; + + /// 4 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, double, aligned_mediump> aligned_mediump_dvec4; + + /// 4 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, double, aligned_lowp> aligned_lowp_dvec4; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef vec<4, int, aligned_highp> aligned_highp_ivec4; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef vec<4, int, aligned_mediump> aligned_mediump_ivec4; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef vec<4, int, aligned_lowp> aligned_lowp_ivec4; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef vec<4, uint, aligned_highp> aligned_highp_uvec4; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef vec<4, uint, aligned_mediump> aligned_mediump_uvec4; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef vec<4, uint, aligned_lowp> aligned_lowp_uvec4; + + /// 4 components vector aligned in memory of bool values. + typedef vec<4, bool, aligned_highp> aligned_highp_bvec4; + + /// 4 components vector aligned in memory of bool values. + typedef vec<4, bool, aligned_mediump> aligned_mediump_bvec4; + + /// 4 components vector aligned in memory of bool values. + typedef vec<4, bool, aligned_lowp> aligned_lowp_bvec4; + + /// 4 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, float, packed_highp> packed_highp_vec4; + + /// 4 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, float, packed_mediump> packed_mediump_vec4; + + /// 4 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, float, packed_lowp> packed_lowp_vec4; + + /// 4 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, double, packed_highp> packed_highp_dvec4; + + /// 4 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, double, packed_mediump> packed_mediump_dvec4; + + /// 4 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, double, packed_lowp> packed_lowp_dvec4; + + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef vec<4, int, packed_highp> packed_highp_ivec4; + + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef vec<4, int, packed_mediump> packed_mediump_ivec4; + + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef vec<4, int, packed_lowp> packed_lowp_ivec4; + + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<4, uint, packed_highp> packed_highp_uvec4; + + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<4, uint, packed_mediump> packed_mediump_uvec4; + + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<4, uint, packed_lowp> packed_lowp_uvec4; + + /// 4 components vector tightly packed in memory of bool values. + typedef vec<4, bool, packed_highp> packed_highp_bvec4; + + /// 4 components vector tightly packed in memory of bool values. + typedef vec<4, bool, packed_mediump> packed_mediump_bvec4; + + /// 4 components vector tightly packed in memory of bool values. + typedef vec<4, bool, packed_lowp> packed_lowp_bvec4; + + // -- *mat2 -- + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_highp> aligned_highp_mat2; + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_mediump> aligned_mediump_mat2; + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_lowp> aligned_lowp_mat2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_highp> aligned_highp_dmat2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_mediump> aligned_mediump_dmat2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_lowp> aligned_lowp_dmat2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_highp> packed_highp_mat2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_mediump> packed_mediump_mat2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_lowp> packed_lowp_mat2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_highp> packed_highp_dmat2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_mediump> packed_mediump_dmat2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_lowp> packed_lowp_dmat2; + + // -- *mat3 -- + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_highp> aligned_highp_mat3; + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_mediump> aligned_mediump_mat3; + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_lowp> aligned_lowp_mat3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_highp> aligned_highp_dmat3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_mediump> aligned_mediump_dmat3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_lowp> aligned_lowp_dmat3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_highp> packed_highp_mat3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_mediump> packed_mediump_mat3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_lowp> packed_lowp_mat3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_highp> packed_highp_dmat3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_mediump> packed_mediump_dmat3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_lowp> packed_lowp_dmat3; + + // -- *mat4 -- + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_highp> aligned_highp_mat4; + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_mediump> aligned_mediump_mat4; + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_lowp> aligned_lowp_mat4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_highp> aligned_highp_dmat4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_mediump> aligned_mediump_dmat4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_lowp> aligned_lowp_dmat4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_highp> packed_highp_mat4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_mediump> packed_mediump_mat4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_lowp> packed_lowp_mat4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_highp> packed_highp_dmat4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_mediump> packed_mediump_dmat4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_lowp> packed_lowp_dmat4; + + // -- *mat2x2 -- + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_highp> aligned_highp_mat2x2; + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_mediump> aligned_mediump_mat2x2; + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_lowp> aligned_lowp_mat2x2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_highp> aligned_highp_dmat2x2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_mediump> aligned_mediump_dmat2x2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_lowp> aligned_lowp_dmat2x2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_highp> packed_highp_mat2x2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_mediump> packed_mediump_mat2x2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_lowp> packed_lowp_mat2x2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_highp> packed_highp_dmat2x2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_mediump> packed_mediump_dmat2x2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_lowp> packed_lowp_dmat2x2; + + // -- *mat2x3 -- + + /// 2 by 3 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 3, float, aligned_highp> aligned_highp_mat2x3; + + /// 2 by 3 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 3, float, aligned_mediump> aligned_mediump_mat2x3; + + /// 2 by 3 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 3, float, aligned_lowp> aligned_lowp_mat2x3; + + /// 2 by 3 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 3, double, aligned_highp> aligned_highp_dmat2x3; + + /// 2 by 3 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 3, double, aligned_mediump> aligned_mediump_dmat2x3; + + /// 2 by 3 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 3, double, aligned_lowp> aligned_lowp_dmat2x3; + + /// 2 by 3 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 3, float, packed_highp> packed_highp_mat2x3; + + /// 2 by 3 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 3, float, packed_mediump> packed_mediump_mat2x3; + + /// 2 by 3 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 3, float, packed_lowp> packed_lowp_mat2x3; + + /// 2 by 3 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 3, double, packed_highp> packed_highp_dmat2x3; + + /// 2 by 3 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 3, double, packed_mediump> packed_mediump_dmat2x3; + + /// 2 by 3 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 3, double, packed_lowp> packed_lowp_dmat2x3; + + // -- *mat2x4 -- + + /// 2 by 4 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 4, float, aligned_highp> aligned_highp_mat2x4; + + /// 2 by 4 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 4, float, aligned_mediump> aligned_mediump_mat2x4; + + /// 2 by 4 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 4, float, aligned_lowp> aligned_lowp_mat2x4; + + /// 2 by 4 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 4, double, aligned_highp> aligned_highp_dmat2x4; + + /// 2 by 4 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 4, double, aligned_mediump> aligned_mediump_dmat2x4; + + /// 2 by 4 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 4, double, aligned_lowp> aligned_lowp_dmat2x4; + + /// 2 by 4 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 4, float, packed_highp> packed_highp_mat2x4; + + /// 2 by 4 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 4, float, packed_mediump> packed_mediump_mat2x4; + + /// 2 by 4 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 4, float, packed_lowp> packed_lowp_mat2x4; + + /// 2 by 4 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 4, double, packed_highp> packed_highp_dmat2x4; + + /// 2 by 4 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 4, double, packed_mediump> packed_mediump_dmat2x4; + + /// 2 by 4 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 4, double, packed_lowp> packed_lowp_dmat2x4; + + // -- *mat3x2 -- + + /// 3 by 2 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 2, float, aligned_highp> aligned_highp_mat3x2; + + /// 3 by 2 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 2, float, aligned_mediump> aligned_mediump_mat3x2; + + /// 3 by 2 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 2, float, aligned_lowp> aligned_lowp_mat3x2; + + /// 3 by 2 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 2, double, aligned_highp> aligned_highp_dmat3x2; + + /// 3 by 2 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 2, double, aligned_mediump> aligned_mediump_dmat3x2; + + /// 3 by 2 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 2, double, aligned_lowp> aligned_lowp_dmat3x2; + + /// 3 by 2 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 2, float, packed_highp> packed_highp_mat3x2; + + /// 3 by 2 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 2, float, packed_mediump> packed_mediump_mat3x2; + + /// 3 by 2 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 2, float, packed_lowp> packed_lowp_mat3x2; + + /// 3 by 2 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 2, double, packed_highp> packed_highp_dmat3x2; + + /// 3 by 2 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 2, double, packed_mediump> packed_mediump_dmat3x2; + + /// 3 by 2 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 2, double, packed_lowp> packed_lowp_dmat3x2; + + // -- *mat3x3 -- + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_highp> aligned_highp_mat3x3; + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_mediump> aligned_mediump_mat3x3; + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_lowp> aligned_lowp_mat3x3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_highp> aligned_highp_dmat3x3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_mediump> aligned_mediump_dmat3x3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_lowp> aligned_lowp_dmat3x3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_highp> packed_highp_mat3x3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_mediump> packed_mediump_mat3x3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_lowp> packed_lowp_mat3x3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_highp> packed_highp_dmat3x3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_mediump> packed_mediump_dmat3x3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_lowp> packed_lowp_dmat3x3; + + // -- *mat3x4 -- + + /// 3 by 4 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 4, float, aligned_highp> aligned_highp_mat3x4; + + /// 3 by 4 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 4, float, aligned_mediump> aligned_mediump_mat3x4; + + /// 3 by 4 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 4, float, aligned_lowp> aligned_lowp_mat3x4; + + /// 3 by 4 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 4, double, aligned_highp> aligned_highp_dmat3x4; + + /// 3 by 4 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 4, double, aligned_mediump> aligned_mediump_dmat3x4; + + /// 3 by 4 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 4, double, aligned_lowp> aligned_lowp_dmat3x4; + + /// 3 by 4 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 4, float, packed_highp> packed_highp_mat3x4; + + /// 3 by 4 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 4, float, packed_mediump> packed_mediump_mat3x4; + + /// 3 by 4 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 4, float, packed_lowp> packed_lowp_mat3x4; + + /// 3 by 4 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 4, double, packed_highp> packed_highp_dmat3x4; + + /// 3 by 4 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 4, double, packed_mediump> packed_mediump_dmat3x4; + + /// 3 by 4 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 4, double, packed_lowp> packed_lowp_dmat3x4; + + // -- *mat4x2 -- + + /// 4 by 2 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 2, float, aligned_highp> aligned_highp_mat4x2; + + /// 4 by 2 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 2, float, aligned_mediump> aligned_mediump_mat4x2; + + /// 4 by 2 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 2, float, aligned_lowp> aligned_lowp_mat4x2; + + /// 4 by 2 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 2, double, aligned_highp> aligned_highp_dmat4x2; + + /// 4 by 2 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 2, double, aligned_mediump> aligned_mediump_dmat4x2; + + /// 4 by 2 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 2, double, aligned_lowp> aligned_lowp_dmat4x2; + + /// 4 by 2 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 2, float, packed_highp> packed_highp_mat4x2; + + /// 4 by 2 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 2, float, packed_mediump> packed_mediump_mat4x2; + + /// 4 by 2 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 2, float, packed_lowp> packed_lowp_mat4x2; + + /// 4 by 2 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 2, double, packed_highp> packed_highp_dmat4x2; + + /// 4 by 2 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 2, double, packed_mediump> packed_mediump_dmat4x2; + + /// 4 by 2 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 2, double, packed_lowp> packed_lowp_dmat4x2; + + // -- *mat4x3 -- + + /// 4 by 3 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 3, float, aligned_highp> aligned_highp_mat4x3; + + /// 4 by 3 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 3, float, aligned_mediump> aligned_mediump_mat4x3; + + /// 4 by 3 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 3, float, aligned_lowp> aligned_lowp_mat4x3; + + /// 4 by 3 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 3, double, aligned_highp> aligned_highp_dmat4x3; + + /// 4 by 3 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 3, double, aligned_mediump> aligned_mediump_dmat4x3; + + /// 4 by 3 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 3, double, aligned_lowp> aligned_lowp_dmat4x3; + + /// 4 by 3 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 3, float, packed_highp> packed_highp_mat4x3; + + /// 4 by 3 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 3, float, packed_mediump> packed_mediump_mat4x3; + + /// 4 by 3 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 3, float, packed_lowp> packed_lowp_mat4x3; + + /// 4 by 3 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 3, double, packed_highp> packed_highp_dmat4x3; + + /// 4 by 3 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 3, double, packed_mediump> packed_mediump_dmat4x3; + + /// 4 by 3 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 3, double, packed_lowp> packed_lowp_dmat4x3; + + // -- *mat4x4 -- + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_highp> aligned_highp_mat4x4; + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_mediump> aligned_mediump_mat4x4; + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_lowp> aligned_lowp_mat4x4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_highp> aligned_highp_dmat4x4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_mediump> aligned_mediump_dmat4x4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_lowp> aligned_lowp_dmat4x4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_highp> packed_highp_mat4x4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_mediump> packed_mediump_mat4x4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_lowp> packed_lowp_mat4x4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_highp> packed_highp_dmat4x4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_mediump> packed_mediump_dmat4x4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_lowp> packed_lowp_dmat4x4; + + // -- default -- + +#if(defined(GLM_PRECISION_LOWP_FLOAT)) + typedef aligned_lowp_vec1 aligned_vec1; + typedef aligned_lowp_vec2 aligned_vec2; + typedef aligned_lowp_vec3 aligned_vec3; + typedef aligned_lowp_vec4 aligned_vec4; + typedef packed_lowp_vec1 packed_vec1; + typedef packed_lowp_vec2 packed_vec2; + typedef packed_lowp_vec3 packed_vec3; + typedef packed_lowp_vec4 packed_vec4; + + typedef aligned_lowp_mat2 aligned_mat2; + typedef aligned_lowp_mat3 aligned_mat3; + typedef aligned_lowp_mat4 aligned_mat4; + typedef packed_lowp_mat2 packed_mat2; + typedef packed_lowp_mat3 packed_mat3; + typedef packed_lowp_mat4 packed_mat4; + + typedef aligned_lowp_mat2x2 aligned_mat2x2; + typedef aligned_lowp_mat2x3 aligned_mat2x3; + typedef aligned_lowp_mat2x4 aligned_mat2x4; + typedef aligned_lowp_mat3x2 aligned_mat3x2; + typedef aligned_lowp_mat3x3 aligned_mat3x3; + typedef aligned_lowp_mat3x4 aligned_mat3x4; + typedef aligned_lowp_mat4x2 aligned_mat4x2; + typedef aligned_lowp_mat4x3 aligned_mat4x3; + typedef aligned_lowp_mat4x4 aligned_mat4x4; + typedef packed_lowp_mat2x2 packed_mat2x2; + typedef packed_lowp_mat2x3 packed_mat2x3; + typedef packed_lowp_mat2x4 packed_mat2x4; + typedef packed_lowp_mat3x2 packed_mat3x2; + typedef packed_lowp_mat3x3 packed_mat3x3; + typedef packed_lowp_mat3x4 packed_mat3x4; + typedef packed_lowp_mat4x2 packed_mat4x2; + typedef packed_lowp_mat4x3 packed_mat4x3; + typedef packed_lowp_mat4x4 packed_mat4x4; +#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) + typedef aligned_mediump_vec1 aligned_vec1; + typedef aligned_mediump_vec2 aligned_vec2; + typedef aligned_mediump_vec3 aligned_vec3; + typedef aligned_mediump_vec4 aligned_vec4; + typedef packed_mediump_vec1 packed_vec1; + typedef packed_mediump_vec2 packed_vec2; + typedef packed_mediump_vec3 packed_vec3; + typedef packed_mediump_vec4 packed_vec4; + + typedef aligned_mediump_mat2 aligned_mat2; + typedef aligned_mediump_mat3 aligned_mat3; + typedef aligned_mediump_mat4 aligned_mat4; + typedef packed_mediump_mat2 packed_mat2; + typedef packed_mediump_mat3 packed_mat3; + typedef packed_mediump_mat4 packed_mat4; + + typedef aligned_mediump_mat2x2 aligned_mat2x2; + typedef aligned_mediump_mat2x3 aligned_mat2x3; + typedef aligned_mediump_mat2x4 aligned_mat2x4; + typedef aligned_mediump_mat3x2 aligned_mat3x2; + typedef aligned_mediump_mat3x3 aligned_mat3x3; + typedef aligned_mediump_mat3x4 aligned_mat3x4; + typedef aligned_mediump_mat4x2 aligned_mat4x2; + typedef aligned_mediump_mat4x3 aligned_mat4x3; + typedef aligned_mediump_mat4x4 aligned_mat4x4; + typedef packed_mediump_mat2x2 packed_mat2x2; + typedef packed_mediump_mat2x3 packed_mat2x3; + typedef packed_mediump_mat2x4 packed_mat2x4; + typedef packed_mediump_mat3x2 packed_mat3x2; + typedef packed_mediump_mat3x3 packed_mat3x3; + typedef packed_mediump_mat3x4 packed_mat3x4; + typedef packed_mediump_mat4x2 packed_mat4x2; + typedef packed_mediump_mat4x3 packed_mat4x3; + typedef packed_mediump_mat4x4 packed_mat4x4; +#else //defined(GLM_PRECISION_HIGHP_FLOAT) + /// 1 component vector aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_vec1 aligned_vec1; + + /// 2 components vector aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_vec2 aligned_vec2; + + /// 3 components vector aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_vec3 aligned_vec3; + + /// 4 components vector aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_vec4 aligned_vec4; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec1 packed_vec1; + + /// 2 components vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec2 packed_vec2; + + /// 3 components vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec3 packed_vec3; + + /// 4 components vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec4 packed_vec4; + + /// 2 by 2 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat2 aligned_mat2; + + /// 3 by 3 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat3 aligned_mat3; + + /// 4 by 4 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat4 aligned_mat4; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat2 packed_mat2; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat3 packed_mat3; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat4 packed_mat4; + + /// 2 by 2 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat2x2 aligned_mat2x2; + + /// 2 by 3 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat2x3 aligned_mat2x3; + + /// 2 by 4 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat2x4 aligned_mat2x4; + + /// 3 by 2 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat3x2 aligned_mat3x2; + + /// 3 by 3 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat3x3 aligned_mat3x3; + + /// 3 by 4 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat3x4 aligned_mat3x4; + + /// 4 by 2 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat4x2 aligned_mat4x2; + + /// 4 by 3 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat4x3 aligned_mat4x3; + + /// 4 by 4 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat4x4 aligned_mat4x4; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat2x2 packed_mat2x2; + + /// 2 by 3 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat2x3 packed_mat2x3; + + /// 2 by 4 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat2x4 packed_mat2x4; + + /// 3 by 2 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat3x2 packed_mat3x2; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat3x3 packed_mat3x3; + + /// 3 by 4 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat3x4 packed_mat3x4; + + /// 4 by 2 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat4x2 packed_mat4x2; + + /// 4 by 3 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat4x3 packed_mat4x3; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat4x4 packed_mat4x4; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_LOWP_DOUBLE)) + typedef aligned_lowp_dvec1 aligned_dvec1; + typedef aligned_lowp_dvec2 aligned_dvec2; + typedef aligned_lowp_dvec3 aligned_dvec3; + typedef aligned_lowp_dvec4 aligned_dvec4; + typedef packed_lowp_dvec1 packed_dvec1; + typedef packed_lowp_dvec2 packed_dvec2; + typedef packed_lowp_dvec3 packed_dvec3; + typedef packed_lowp_dvec4 packed_dvec4; + + typedef aligned_lowp_dmat2 aligned_dmat2; + typedef aligned_lowp_dmat3 aligned_dmat3; + typedef aligned_lowp_dmat4 aligned_dmat4; + typedef packed_lowp_dmat2 packed_dmat2; + typedef packed_lowp_dmat3 packed_dmat3; + typedef packed_lowp_dmat4 packed_dmat4; + + typedef aligned_lowp_dmat2x2 aligned_dmat2x2; + typedef aligned_lowp_dmat2x3 aligned_dmat2x3; + typedef aligned_lowp_dmat2x4 aligned_dmat2x4; + typedef aligned_lowp_dmat3x2 aligned_dmat3x2; + typedef aligned_lowp_dmat3x3 aligned_dmat3x3; + typedef aligned_lowp_dmat3x4 aligned_dmat3x4; + typedef aligned_lowp_dmat4x2 aligned_dmat4x2; + typedef aligned_lowp_dmat4x3 aligned_dmat4x3; + typedef aligned_lowp_dmat4x4 aligned_dmat4x4; + typedef packed_lowp_dmat2x2 packed_dmat2x2; + typedef packed_lowp_dmat2x3 packed_dmat2x3; + typedef packed_lowp_dmat2x4 packed_dmat2x4; + typedef packed_lowp_dmat3x2 packed_dmat3x2; + typedef packed_lowp_dmat3x3 packed_dmat3x3; + typedef packed_lowp_dmat3x4 packed_dmat3x4; + typedef packed_lowp_dmat4x2 packed_dmat4x2; + typedef packed_lowp_dmat4x3 packed_dmat4x3; + typedef packed_lowp_dmat4x4 packed_dmat4x4; +#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE)) + typedef aligned_mediump_dvec1 aligned_dvec1; + typedef aligned_mediump_dvec2 aligned_dvec2; + typedef aligned_mediump_dvec3 aligned_dvec3; + typedef aligned_mediump_dvec4 aligned_dvec4; + typedef packed_mediump_dvec1 packed_dvec1; + typedef packed_mediump_dvec2 packed_dvec2; + typedef packed_mediump_dvec3 packed_dvec3; + typedef packed_mediump_dvec4 packed_dvec4; + + typedef aligned_mediump_dmat2 aligned_dmat2; + typedef aligned_mediump_dmat3 aligned_dmat3; + typedef aligned_mediump_dmat4 aligned_dmat4; + typedef packed_mediump_dmat2 packed_dmat2; + typedef packed_mediump_dmat3 packed_dmat3; + typedef packed_mediump_dmat4 packed_dmat4; + + typedef aligned_mediump_dmat2x2 aligned_dmat2x2; + typedef aligned_mediump_dmat2x3 aligned_dmat2x3; + typedef aligned_mediump_dmat2x4 aligned_dmat2x4; + typedef aligned_mediump_dmat3x2 aligned_dmat3x2; + typedef aligned_mediump_dmat3x3 aligned_dmat3x3; + typedef aligned_mediump_dmat3x4 aligned_dmat3x4; + typedef aligned_mediump_dmat4x2 aligned_dmat4x2; + typedef aligned_mediump_dmat4x3 aligned_dmat4x3; + typedef aligned_mediump_dmat4x4 aligned_dmat4x4; + typedef packed_mediump_dmat2x2 packed_dmat2x2; + typedef packed_mediump_dmat2x3 packed_dmat2x3; + typedef packed_mediump_dmat2x4 packed_dmat2x4; + typedef packed_mediump_dmat3x2 packed_dmat3x2; + typedef packed_mediump_dmat3x3 packed_dmat3x3; + typedef packed_mediump_dmat3x4 packed_dmat3x4; + typedef packed_mediump_dmat4x2 packed_dmat4x2; + typedef packed_mediump_dmat4x3 packed_dmat4x3; + typedef packed_mediump_dmat4x4 packed_dmat4x4; +#else //defined(GLM_PRECISION_HIGHP_DOUBLE) + /// 1 component vector aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dvec1 aligned_dvec1; + + /// 2 components vector aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dvec2 aligned_dvec2; + + /// 3 components vector aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dvec3 aligned_dvec3; + + /// 4 components vector aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dvec4 aligned_dvec4; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec1 packed_dvec1; + + /// 2 components vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec2 packed_dvec2; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec3 packed_dvec3; + + /// 4 components vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec4 packed_dvec4; + + /// 2 by 2 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat2 aligned_dmat2; + + /// 3 by 3 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat3 aligned_dmat3; + + /// 4 by 4 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat4 aligned_dmat4; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat2 packed_dmat2; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat3 packed_dmat3; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat4 packed_dmat4; + + /// 2 by 2 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat2x2 aligned_dmat2x2; + + /// 2 by 3 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat2x3 aligned_dmat2x3; + + /// 2 by 4 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat2x4 aligned_dmat2x4; + + /// 3 by 2 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat3x2 aligned_dmat3x2; + + /// 3 by 3 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat3x3 aligned_dmat3x3; + + /// 3 by 4 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat3x4 aligned_dmat3x4; + + /// 4 by 2 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat4x2 aligned_dmat4x2; + + /// 4 by 3 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat4x3 aligned_dmat4x3; + + /// 4 by 4 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat4x4 aligned_dmat4x4; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat2x2 packed_dmat2x2; + + /// 2 by 3 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat2x3 packed_dmat2x3; + + /// 2 by 4 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat2x4 packed_dmat2x4; + + /// 3 by 2 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat3x2 packed_dmat3x2; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat3x3 packed_dmat3x3; + + /// 3 by 4 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat3x4 packed_dmat3x4; + + /// 4 by 2 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat4x2 packed_dmat4x2; + + /// 4 by 3 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat4x3 packed_dmat4x3; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat4x4 packed_dmat4x4; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_LOWP_INT)) + typedef aligned_lowp_ivec1 aligned_ivec1; + typedef aligned_lowp_ivec2 aligned_ivec2; + typedef aligned_lowp_ivec3 aligned_ivec3; + typedef aligned_lowp_ivec4 aligned_ivec4; +#elif(defined(GLM_PRECISION_MEDIUMP_INT)) + typedef aligned_mediump_ivec1 aligned_ivec1; + typedef aligned_mediump_ivec2 aligned_ivec2; + typedef aligned_mediump_ivec3 aligned_ivec3; + typedef aligned_mediump_ivec4 aligned_ivec4; +#else //defined(GLM_PRECISION_HIGHP_INT) + /// 1 component vector aligned in memory of signed integer numbers. + typedef aligned_highp_ivec1 aligned_ivec1; + + /// 2 components vector aligned in memory of signed integer numbers. + typedef aligned_highp_ivec2 aligned_ivec2; + + /// 3 components vector aligned in memory of signed integer numbers. + typedef aligned_highp_ivec3 aligned_ivec3; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef aligned_highp_ivec4 aligned_ivec4; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec1 packed_ivec1; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec2 packed_ivec2; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec3 packed_ivec3; + + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec4 packed_ivec4; +#endif//GLM_PRECISION + + // -- Unsigned integer definition -- + +#if(defined(GLM_PRECISION_LOWP_UINT)) + typedef aligned_lowp_uvec1 aligned_uvec1; + typedef aligned_lowp_uvec2 aligned_uvec2; + typedef aligned_lowp_uvec3 aligned_uvec3; + typedef aligned_lowp_uvec4 aligned_uvec4; +#elif(defined(GLM_PRECISION_MEDIUMP_UINT)) + typedef aligned_mediump_uvec1 aligned_uvec1; + typedef aligned_mediump_uvec2 aligned_uvec2; + typedef aligned_mediump_uvec3 aligned_uvec3; + typedef aligned_mediump_uvec4 aligned_uvec4; +#else //defined(GLM_PRECISION_HIGHP_UINT) + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef aligned_highp_uvec1 aligned_uvec1; + + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef aligned_highp_uvec2 aligned_uvec2; + + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef aligned_highp_uvec3 aligned_uvec3; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef aligned_highp_uvec4 aligned_uvec4; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec1 packed_uvec1; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec2 packed_uvec2; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec3 packed_uvec3; + + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec4 packed_uvec4; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_LOWP_BOOL)) + typedef aligned_lowp_bvec1 aligned_bvec1; + typedef aligned_lowp_bvec2 aligned_bvec2; + typedef aligned_lowp_bvec3 aligned_bvec3; + typedef aligned_lowp_bvec4 aligned_bvec4; +#elif(defined(GLM_PRECISION_MEDIUMP_BOOL)) + typedef aligned_mediump_bvec1 aligned_bvec1; + typedef aligned_mediump_bvec2 aligned_bvec2; + typedef aligned_mediump_bvec3 aligned_bvec3; + typedef aligned_mediump_bvec4 aligned_bvec4; +#else //defined(GLM_PRECISION_HIGHP_BOOL) + /// 1 component vector aligned in memory of bool values. + typedef aligned_highp_bvec1 aligned_bvec1; + + /// 2 components vector aligned in memory of bool values. + typedef aligned_highp_bvec2 aligned_bvec2; + + /// 3 components vector aligned in memory of bool values. + typedef aligned_highp_bvec3 aligned_bvec3; + + /// 4 components vector aligned in memory of bool values. + typedef aligned_highp_bvec4 aligned_bvec4; + + /// 1 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec1 packed_bvec1; + + /// 2 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec2 packed_bvec2; + + /// 3 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec3 packed_bvec3; + + /// 4 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec4 packed_bvec4; +#endif//GLM_PRECISION + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtc/type_precision.hpp b/NothinFancy/dep/include/glm/gtc/type_precision.hpp new file mode 100644 index 0000000..775e2f4 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/type_precision.hpp @@ -0,0 +1,2094 @@ +/// @ref gtc_type_precision +/// @file glm/gtc/type_precision.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtc_type_precision GLM_GTC_type_precision +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines specific C++-based qualifier types. + +#pragma once + +// Dependency: +#include "../gtc/quaternion.hpp" +#include "../gtc/vec1.hpp" +#include "../ext/vector_int1_sized.hpp" +#include "../ext/vector_int2_sized.hpp" +#include "../ext/vector_int3_sized.hpp" +#include "../ext/vector_int4_sized.hpp" +#include "../ext/scalar_int_sized.hpp" +#include "../ext/vector_uint1_sized.hpp" +#include "../ext/vector_uint2_sized.hpp" +#include "../ext/vector_uint3_sized.hpp" +#include "../ext/vector_uint4_sized.hpp" +#include "../ext/scalar_uint_sized.hpp" +#include "../detail/type_vec2.hpp" +#include "../detail/type_vec3.hpp" +#include "../detail/type_vec4.hpp" +#include "../detail/type_mat2x2.hpp" +#include "../detail/type_mat2x3.hpp" +#include "../detail/type_mat2x4.hpp" +#include "../detail/type_mat3x2.hpp" +#include "../detail/type_mat3x3.hpp" +#include "../detail/type_mat3x4.hpp" +#include "../detail/type_mat4x2.hpp" +#include "../detail/type_mat4x3.hpp" +#include "../detail/type_mat4x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_type_precision extension included") +#endif + +namespace glm +{ + /////////////////////////// + // Signed int vector types + + /// @addtogroup gtc_type_precision + /// @{ + + /// Low qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 lowp_int8; + + /// Low qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 lowp_int16; + + /// Low qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 lowp_int32; + + /// Low qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 lowp_int64; + + /// Low qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 lowp_int8_t; + + /// Low qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 lowp_int16_t; + + /// Low qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 lowp_int32_t; + + /// Low qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 lowp_int64_t; + + /// Low qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 lowp_i8; + + /// Low qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 lowp_i16; + + /// Low qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 lowp_i32; + + /// Low qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 lowp_i64; + + /// Medium qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 mediump_int8; + + /// Medium qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 mediump_int16; + + /// Medium qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 mediump_int32; + + /// Medium qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 mediump_int64; + + /// Medium qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 mediump_int8_t; + + /// Medium qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 mediump_int16_t; + + /// Medium qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 mediump_int32_t; + + /// Medium qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 mediump_int64_t; + + /// Medium qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 mediump_i8; + + /// Medium qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 mediump_i16; + + /// Medium qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 mediump_i32; + + /// Medium qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 mediump_i64; + + /// High qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 highp_int8; + + /// High qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 highp_int16; + + /// High qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 highp_int32; + + /// High qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 highp_int64; + + /// High qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 highp_int8_t; + + /// High qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 highp_int16_t; + + /// 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 highp_int32_t; + + /// High qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 highp_int64_t; + + /// High qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 highp_i8; + + /// High qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 highp_i16; + + /// High qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 highp_i32; + + /// High qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 highp_i64; + + +#if GLM_HAS_EXTENDED_INTEGER_TYPE + using std::int8_t; + using std::int16_t; + using std::int32_t; + using std::int64_t; +#else + /// 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 int8_t; + + /// 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 int16_t; + + /// 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 int32_t; + + /// 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 int64_t; +#endif + + /// 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 i8; + + /// 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 i16; + + /// 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 i32; + + /// 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 i64; + + ///////////////////////////// + // Unsigned int vector types + + /// Low qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 lowp_uint8; + + /// Low qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 lowp_uint16; + + /// Low qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 lowp_uint32; + + /// Low qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 lowp_uint64; + + /// Low qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 lowp_uint8_t; + + /// Low qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 lowp_uint16_t; + + /// Low qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 lowp_uint32_t; + + /// Low qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 lowp_uint64_t; + + /// Low qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 lowp_u8; + + /// Low qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 lowp_u16; + + /// Low qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 lowp_u32; + + /// Low qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 lowp_u64; + + /// Medium qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 mediump_uint8; + + /// Medium qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 mediump_uint16; + + /// Medium qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 mediump_uint32; + + /// Medium qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 mediump_uint64; + + /// Medium qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 mediump_uint8_t; + + /// Medium qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 mediump_uint16_t; + + /// Medium qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 mediump_uint32_t; + + /// Medium qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 mediump_uint64_t; + + /// Medium qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 mediump_u8; + + /// Medium qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 mediump_u16; + + /// Medium qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 mediump_u32; + + /// Medium qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 mediump_u64; + + /// High qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 highp_uint8; + + /// High qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 highp_uint16; + + /// High qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 highp_uint32; + + /// High qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 highp_uint64; + + /// High qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 highp_uint8_t; + + /// High qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 highp_uint16_t; + + /// High qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 highp_uint32_t; + + /// High qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 highp_uint64_t; + + /// High qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 highp_u8; + + /// High qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 highp_u16; + + /// High qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 highp_u32; + + /// High qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 highp_u64; + +#if GLM_HAS_EXTENDED_INTEGER_TYPE + using std::uint8_t; + using std::uint16_t; + using std::uint32_t; + using std::uint64_t; +#else + /// Default qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 uint8_t; + + /// Default qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 uint16_t; + + /// Default qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 uint32_t; + + /// Default qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 uint64_t; +#endif + + /// Default qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 u8; + + /// Default qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 u16; + + /// Default qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 u32; + + /// Default qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 u64; + + + + + + ////////////////////// + // Float vector types + + /// Single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float float32; + + /// Double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef double float64; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32_t; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64_t; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_f32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_f64; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32_t; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64_t; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_f32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_f64; + + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32_t; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64_t; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_f32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_f64; + + + /// Medium 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 mediump_float32; + + /// Medium 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 mediump_float64; + + /// Medium 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 mediump_float32_t; + + /// Medium 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 mediump_float64_t; + + /// Medium 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 mediump_f32; + + /// Medium 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 mediump_f64; + + + /// High 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 highp_float32; + + /// High 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 highp_float64; + + /// High 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 highp_float32_t; + + /// High 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 highp_float64_t; + + /// High 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 highp_f32; + + /// High 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 highp_f64; + + +#if(defined(GLM_PRECISION_LOWP_FLOAT)) + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef lowp_float32_t float32_t; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef lowp_float64_t float64_t; + + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef lowp_f32 f32; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef lowp_f64 f64; + +#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef mediump_float32 float32_t; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef mediump_float64 float64_t; + + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef mediump_float32 f32; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef mediump_float64 f64; + +#else//(defined(GLM_PRECISION_HIGHP_FLOAT)) + + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef highp_float32_t float32_t; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef highp_float64_t float64_t; + + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef highp_float32_t f32; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef highp_float64_t f64; +#endif + + + /// Low single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, float, lowp> lowp_fvec1; + + /// Low single-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, float, lowp> lowp_fvec2; + + /// Low single-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, float, lowp> lowp_fvec3; + + /// Low single-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, float, lowp> lowp_fvec4; + + + /// Medium single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, float, mediump> mediump_fvec1; + + /// Medium Single-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, float, mediump> mediump_fvec2; + + /// Medium Single-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, float, mediump> mediump_fvec3; + + /// Medium Single-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, float, mediump> mediump_fvec4; + + + /// High single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, float, highp> highp_fvec1; + + /// High Single-qualifier floating-point vector of 2 components. + /// @see core_precision + typedef vec<2, float, highp> highp_fvec2; + + /// High Single-qualifier floating-point vector of 3 components. + /// @see core_precision + typedef vec<3, float, highp> highp_fvec3; + + /// High Single-qualifier floating-point vector of 4 components. + /// @see core_precision + typedef vec<4, float, highp> highp_fvec4; + + + /// Low single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f32, lowp> lowp_f32vec1; + + /// Low single-qualifier floating-point vector of 2 components. + /// @see core_precision + typedef vec<2, f32, lowp> lowp_f32vec2; + + /// Low single-qualifier floating-point vector of 3 components. + /// @see core_precision + typedef vec<3, f32, lowp> lowp_f32vec3; + + /// Low single-qualifier floating-point vector of 4 components. + /// @see core_precision + typedef vec<4, f32, lowp> lowp_f32vec4; + + /// Medium single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f32, mediump> mediump_f32vec1; + + /// Medium single-qualifier floating-point vector of 2 components. + /// @see core_precision + typedef vec<2, f32, mediump> mediump_f32vec2; + + /// Medium single-qualifier floating-point vector of 3 components. + /// @see core_precision + typedef vec<3, f32, mediump> mediump_f32vec3; + + /// Medium single-qualifier floating-point vector of 4 components. + /// @see core_precision + typedef vec<4, f32, mediump> mediump_f32vec4; + + /// High single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f32, highp> highp_f32vec1; + + /// High single-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f32, highp> highp_f32vec2; + + /// High single-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f32, highp> highp_f32vec3; + + /// High single-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f32, highp> highp_f32vec4; + + + /// Low double-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f64, lowp> lowp_f64vec1; + + /// Low double-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f64, lowp> lowp_f64vec2; + + /// Low double-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f64, lowp> lowp_f64vec3; + + /// Low double-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f64, lowp> lowp_f64vec4; + + /// Medium double-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f64, mediump> mediump_f64vec1; + + /// Medium double-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f64, mediump> mediump_f64vec2; + + /// Medium double-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f64, mediump> mediump_f64vec3; + + /// Medium double-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f64, mediump> mediump_f64vec4; + + /// High double-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f64, highp> highp_f64vec1; + + /// High double-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f64, highp> highp_f64vec2; + + /// High double-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f64, highp> highp_f64vec3; + + /// High double-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f64, highp> highp_f64vec4; + + + + ////////////////////// + // Float matrix types + + /// Low single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef lowp_f32 lowp_fmat1x1; + + /// Low single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, lowp> lowp_fmat2x2; + + /// Low single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, lowp> lowp_fmat2x3; + + /// Low single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, lowp> lowp_fmat2x4; + + /// Low single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, lowp> lowp_fmat3x2; + + /// Low single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, lowp> lowp_fmat3x3; + + /// Low single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, lowp> lowp_fmat3x4; + + /// Low single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, lowp> lowp_fmat4x2; + + /// Low single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, lowp> lowp_fmat4x3; + + /// Low single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, lowp> lowp_fmat4x4; + + /// Low single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef lowp_fmat1x1 lowp_fmat1; + + /// Low single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef lowp_fmat2x2 lowp_fmat2; + + /// Low single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef lowp_fmat3x3 lowp_fmat3; + + /// Low single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef lowp_fmat4x4 lowp_fmat4; + + + /// Medium single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef mediump_f32 mediump_fmat1x1; + + /// Medium single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, mediump> mediump_fmat2x2; + + /// Medium single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, mediump> mediump_fmat2x3; + + /// Medium single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, mediump> mediump_fmat2x4; + + /// Medium single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, mediump> mediump_fmat3x2; + + /// Medium single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, mediump> mediump_fmat3x3; + + /// Medium single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, mediump> mediump_fmat3x4; + + /// Medium single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, mediump> mediump_fmat4x2; + + /// Medium single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, mediump> mediump_fmat4x3; + + /// Medium single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, mediump> mediump_fmat4x4; + + /// Medium single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef mediump_fmat1x1 mediump_fmat1; + + /// Medium single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mediump_fmat2x2 mediump_fmat2; + + /// Medium single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mediump_fmat3x3 mediump_fmat3; + + /// Medium single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mediump_fmat4x4 mediump_fmat4; + + + /// High single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef highp_f32 highp_fmat1x1; + + /// High single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, highp> highp_fmat2x2; + + /// High single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, highp> highp_fmat2x3; + + /// High single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, highp> highp_fmat2x4; + + /// High single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, highp> highp_fmat3x2; + + /// High single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, highp> highp_fmat3x3; + + /// High single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, highp> highp_fmat3x4; + + /// High single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, highp> highp_fmat4x2; + + /// High single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, highp> highp_fmat4x3; + + /// High single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, highp> highp_fmat4x4; + + /// High single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef highp_fmat1x1 highp_fmat1; + + /// High single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef highp_fmat2x2 highp_fmat2; + + /// High single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef highp_fmat3x3 highp_fmat3; + + /// High single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef highp_fmat4x4 highp_fmat4; + + + /// Low single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 lowp_f32mat1x1; + + /// Low single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, lowp> lowp_f32mat2x2; + + /// Low single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, lowp> lowp_f32mat2x3; + + /// Low single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, lowp> lowp_f32mat2x4; + + /// Low single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, lowp> lowp_f32mat3x2; + + /// Low single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, lowp> lowp_f32mat3x3; + + /// Low single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, lowp> lowp_f32mat3x4; + + /// Low single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, lowp> lowp_f32mat4x2; + + /// Low single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, lowp> lowp_f32mat4x3; + + /// Low single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, lowp> lowp_f32mat4x4; + + /// Low single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 lowp_f32mat1; + + /// Low single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef lowp_f32mat2x2 lowp_f32mat2; + + /// Low single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef lowp_f32mat3x3 lowp_f32mat3; + + /// Low single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef lowp_f32mat4x4 lowp_f32mat4; + + + /// High single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 mediump_f32mat1x1; + + /// Low single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, mediump> mediump_f32mat2x2; + + /// Medium single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, mediump> mediump_f32mat2x3; + + /// Medium single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, mediump> mediump_f32mat2x4; + + /// Medium single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, mediump> mediump_f32mat3x2; + + /// Medium single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, mediump> mediump_f32mat3x3; + + /// Medium single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, mediump> mediump_f32mat3x4; + + /// Medium single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, mediump> mediump_f32mat4x2; + + /// Medium single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, mediump> mediump_f32mat4x3; + + /// Medium single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, mediump> mediump_f32mat4x4; + + /// Medium single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 f32mat1; + + /// Medium single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mediump_f32mat2x2 mediump_f32mat2; + + /// Medium single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mediump_f32mat3x3 mediump_f32mat3; + + /// Medium single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mediump_f32mat4x4 mediump_f32mat4; + + + /// High single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 highp_f32mat1x1; + + /// High single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, highp> highp_f32mat2x2; + + /// High single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, highp> highp_f32mat2x3; + + /// High single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, highp> highp_f32mat2x4; + + /// High single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, highp> highp_f32mat3x2; + + /// High single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, highp> highp_f32mat3x3; + + /// High single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, highp> highp_f32mat3x4; + + /// High single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, highp> highp_f32mat4x2; + + /// High single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, highp> highp_f32mat4x3; + + /// High single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, highp> highp_f32mat4x4; + + /// High single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 f32mat1; + + /// High single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef highp_f32mat2x2 highp_f32mat2; + + /// High single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef highp_f32mat3x3 highp_f32mat3; + + /// High single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef highp_f32mat4x4 highp_f32mat4; + + + /// Low double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f64 lowp_f64mat1x1; + + /// Low double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f64, lowp> lowp_f64mat2x2; + + /// Low double-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f64, lowp> lowp_f64mat2x3; + + /// Low double-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f64, lowp> lowp_f64mat2x4; + + /// Low double-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f64, lowp> lowp_f64mat3x2; + + /// Low double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f64, lowp> lowp_f64mat3x3; + + /// Low double-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f64, lowp> lowp_f64mat3x4; + + /// Low double-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f64, lowp> lowp_f64mat4x2; + + /// Low double-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f64, lowp> lowp_f64mat4x3; + + /// Low double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f64, lowp> lowp_f64mat4x4; + + /// Low double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef lowp_f64mat1x1 lowp_f64mat1; + + /// Low double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef lowp_f64mat2x2 lowp_f64mat2; + + /// Low double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef lowp_f64mat3x3 lowp_f64mat3; + + /// Low double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef lowp_f64mat4x4 lowp_f64mat4; + + + /// Medium double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f64 Highp_f64mat1x1; + + /// Medium double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f64, mediump> mediump_f64mat2x2; + + /// Medium double-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f64, mediump> mediump_f64mat2x3; + + /// Medium double-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f64, mediump> mediump_f64mat2x4; + + /// Medium double-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f64, mediump> mediump_f64mat3x2; + + /// Medium double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f64, mediump> mediump_f64mat3x3; + + /// Medium double-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f64, mediump> mediump_f64mat3x4; + + /// Medium double-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f64, mediump> mediump_f64mat4x2; + + /// Medium double-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f64, mediump> mediump_f64mat4x3; + + /// Medium double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f64, mediump> mediump_f64mat4x4; + + /// Medium double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef mediump_f64mat1x1 mediump_f64mat1; + + /// Medium double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mediump_f64mat2x2 mediump_f64mat2; + + /// Medium double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mediump_f64mat3x3 mediump_f64mat3; + + /// Medium double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mediump_f64mat4x4 mediump_f64mat4; + + /// High double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f64 highp_f64mat1x1; + + /// High double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f64, highp> highp_f64mat2x2; + + /// High double-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f64, highp> highp_f64mat2x3; + + /// High double-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f64, highp> highp_f64mat2x4; + + /// High double-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f64, highp> highp_f64mat3x2; + + /// High double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f64, highp> highp_f64mat3x3; + + /// High double-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f64, highp> highp_f64mat3x4; + + /// High double-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f64, highp> highp_f64mat4x2; + + /// High double-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f64, highp> highp_f64mat4x3; + + /// High double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f64, highp> highp_f64mat4x4; + + /// High double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef highp_f64mat1x1 highp_f64mat1; + + /// High double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef highp_f64mat2x2 highp_f64mat2; + + /// High double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef highp_f64mat3x3 highp_f64mat3; + + /// High double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef highp_f64mat4x4 highp_f64mat4; + + + ///////////////////////////// + // Signed int vector types + + /// Low qualifier signed integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, int, lowp> lowp_ivec1; + + /// Low qualifier signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, int, lowp> lowp_ivec2; + + /// Low qualifier signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, int, lowp> lowp_ivec3; + + /// Low qualifier signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, int, lowp> lowp_ivec4; + + + /// Medium qualifier signed integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, int, mediump> mediump_ivec1; + + /// Medium qualifier signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, int, mediump> mediump_ivec2; + + /// Medium qualifier signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, int, mediump> mediump_ivec3; + + /// Medium qualifier signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, int, mediump> mediump_ivec4; + + + /// High qualifier signed integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, int, highp> highp_ivec1; + + /// High qualifier signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, int, highp> highp_ivec2; + + /// High qualifier signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, int, highp> highp_ivec3; + + /// High qualifier signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, int, highp> highp_ivec4; + + + /// Low qualifier 8 bit signed integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, i8, lowp> lowp_i8vec1; + + /// Low qualifier 8 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i8, lowp> lowp_i8vec2; + + /// Low qualifier 8 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i8, lowp> lowp_i8vec3; + + /// Low qualifier 8 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i8, lowp> lowp_i8vec4; + + + /// Medium qualifier 8 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i8, mediump> mediump_i8vec1; + + /// Medium qualifier 8 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i8, mediump> mediump_i8vec2; + + /// Medium qualifier 8 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i8, mediump> mediump_i8vec3; + + /// Medium qualifier 8 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i8, mediump> mediump_i8vec4; + + + /// High qualifier 8 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i8, highp> highp_i8vec1; + + /// High qualifier 8 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i8, highp> highp_i8vec2; + + /// High qualifier 8 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i8, highp> highp_i8vec3; + + /// High qualifier 8 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i8, highp> highp_i8vec4; + + + /// Low qualifier 16 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i16, lowp> lowp_i16vec1; + + /// Low qualifier 16 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i16, lowp> lowp_i16vec2; + + /// Low qualifier 16 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i16, lowp> lowp_i16vec3; + + /// Low qualifier 16 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i16, lowp> lowp_i16vec4; + + + /// Medium qualifier 16 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i16, mediump> mediump_i16vec1; + + /// Medium qualifier 16 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i16, mediump> mediump_i16vec2; + + /// Medium qualifier 16 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i16, mediump> mediump_i16vec3; + + /// Medium qualifier 16 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i16, mediump> mediump_i16vec4; + + + /// High qualifier 16 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i16, highp> highp_i16vec1; + + /// High qualifier 16 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i16, highp> highp_i16vec2; + + /// High qualifier 16 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i16, highp> highp_i16vec3; + + /// High qualifier 16 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i16, highp> highp_i16vec4; + + + /// Low qualifier 32 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i32, lowp> lowp_i32vec1; + + /// Low qualifier 32 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i32, lowp> lowp_i32vec2; + + /// Low qualifier 32 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i32, lowp> lowp_i32vec3; + + /// Low qualifier 32 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i32, lowp> lowp_i32vec4; + + + /// Medium qualifier 32 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i32, mediump> mediump_i32vec1; + + /// Medium qualifier 32 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i32, mediump> mediump_i32vec2; + + /// Medium qualifier 32 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i32, mediump> mediump_i32vec3; + + /// Medium qualifier 32 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i32, mediump> mediump_i32vec4; + + + /// High qualifier 32 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i32, highp> highp_i32vec1; + + /// High qualifier 32 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i32, highp> highp_i32vec2; + + /// High qualifier 32 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i32, highp> highp_i32vec3; + + /// High qualifier 32 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i32, highp> highp_i32vec4; + + + /// Low qualifier 64 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i64, lowp> lowp_i64vec1; + + /// Low qualifier 64 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i64, lowp> lowp_i64vec2; + + /// Low qualifier 64 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i64, lowp> lowp_i64vec3; + + /// Low qualifier 64 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i64, lowp> lowp_i64vec4; + + + /// Medium qualifier 64 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i64, mediump> mediump_i64vec1; + + /// Medium qualifier 64 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i64, mediump> mediump_i64vec2; + + /// Medium qualifier 64 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i64, mediump> mediump_i64vec3; + + /// Medium qualifier 64 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i64, mediump> mediump_i64vec4; + + + /// High qualifier 64 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i64, highp> highp_i64vec1; + + /// High qualifier 64 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i64, highp> highp_i64vec2; + + /// High qualifier 64 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i64, highp> highp_i64vec3; + + /// High qualifier 64 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i64, highp> highp_i64vec4; + + + ///////////////////////////// + // Unsigned int vector types + + /// Low qualifier unsigned integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, uint, lowp> lowp_uvec1; + + /// Low qualifier unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, uint, lowp> lowp_uvec2; + + /// Low qualifier unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, uint, lowp> lowp_uvec3; + + /// Low qualifier unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, uint, lowp> lowp_uvec4; + + + /// Medium qualifier unsigned integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, uint, mediump> mediump_uvec1; + + /// Medium qualifier unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, uint, mediump> mediump_uvec2; + + /// Medium qualifier unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, uint, mediump> mediump_uvec3; + + /// Medium qualifier unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, uint, mediump> mediump_uvec4; + + + /// High qualifier unsigned integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, uint, highp> highp_uvec1; + + /// High qualifier unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, uint, highp> highp_uvec2; + + /// High qualifier unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, uint, highp> highp_uvec3; + + /// High qualifier unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, uint, highp> highp_uvec4; + + + /// Low qualifier 8 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u8, lowp> lowp_u8vec1; + + /// Low qualifier 8 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u8, lowp> lowp_u8vec2; + + /// Low qualifier 8 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u8, lowp> lowp_u8vec3; + + /// Low qualifier 8 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u8, lowp> lowp_u8vec4; + + + /// Medium qualifier 8 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u8, mediump> mediump_u8vec1; + + /// Medium qualifier 8 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u8, mediump> mediump_u8vec2; + + /// Medium qualifier 8 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u8, mediump> mediump_u8vec3; + + /// Medium qualifier 8 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u8, mediump> mediump_u8vec4; + + + /// High qualifier 8 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u8, highp> highp_u8vec1; + + /// High qualifier 8 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u8, highp> highp_u8vec2; + + /// High qualifier 8 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u8, highp> highp_u8vec3; + + /// High qualifier 8 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u8, highp> highp_u8vec4; + + + /// Low qualifier 16 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u16, lowp> lowp_u16vec1; + + /// Low qualifier 16 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u16, lowp> lowp_u16vec2; + + /// Low qualifier 16 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u16, lowp> lowp_u16vec3; + + /// Low qualifier 16 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u16, lowp> lowp_u16vec4; + + + /// Medium qualifier 16 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u16, mediump> mediump_u16vec1; + + /// Medium qualifier 16 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u16, mediump> mediump_u16vec2; + + /// Medium qualifier 16 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u16, mediump> mediump_u16vec3; + + /// Medium qualifier 16 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u16, mediump> mediump_u16vec4; + + + /// High qualifier 16 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u16, highp> highp_u16vec1; + + /// High qualifier 16 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u16, highp> highp_u16vec2; + + /// High qualifier 16 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u16, highp> highp_u16vec3; + + /// High qualifier 16 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u16, highp> highp_u16vec4; + + + /// Low qualifier 32 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u32, lowp> lowp_u32vec1; + + /// Low qualifier 32 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u32, lowp> lowp_u32vec2; + + /// Low qualifier 32 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u32, lowp> lowp_u32vec3; + + /// Low qualifier 32 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u32, lowp> lowp_u32vec4; + + + /// Medium qualifier 32 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u32, mediump> mediump_u32vec1; + + /// Medium qualifier 32 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u32, mediump> mediump_u32vec2; + + /// Medium qualifier 32 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u32, mediump> mediump_u32vec3; + + /// Medium qualifier 32 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u32, mediump> mediump_u32vec4; + + + /// High qualifier 32 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u32, highp> highp_u32vec1; + + /// High qualifier 32 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u32, highp> highp_u32vec2; + + /// High qualifier 32 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u32, highp> highp_u32vec3; + + /// High qualifier 32 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u32, highp> highp_u32vec4; + + + /// Low qualifier 64 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u64, lowp> lowp_u64vec1; + + /// Low qualifier 64 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u64, lowp> lowp_u64vec2; + + /// Low qualifier 64 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u64, lowp> lowp_u64vec3; + + /// Low qualifier 64 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u64, lowp> lowp_u64vec4; + + + /// Medium qualifier 64 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u64, mediump> mediump_u64vec1; + + /// Medium qualifier 64 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u64, mediump> mediump_u64vec2; + + /// Medium qualifier 64 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u64, mediump> mediump_u64vec3; + + /// Medium qualifier 64 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u64, mediump> mediump_u64vec4; + + + /// High qualifier 64 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u64, highp> highp_u64vec1; + + /// High qualifier 64 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u64, highp> highp_u64vec2; + + /// High qualifier 64 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u64, highp> highp_u64vec3; + + /// High qualifier 64 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u64, highp> highp_u64vec4; + + + ////////////////////// + // Float vector types + + /// 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 float32_t; + + /// 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 f32; + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 float64_t; + + /// 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 f64; +# endif//GLM_FORCE_SINGLE_ONLY + + /// Single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, float, defaultp> fvec1; + + /// Single-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, float, defaultp> fvec2; + + /// Single-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, float, defaultp> fvec3; + + /// Single-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, float, defaultp> fvec4; + + + /// Single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f32, defaultp> f32vec1; + + /// Single-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f32, defaultp> f32vec2; + + /// Single-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f32, defaultp> f32vec3; + + /// Single-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f32, defaultp> f32vec4; + +# ifndef GLM_FORCE_SINGLE_ONLY + /// Double-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f64, defaultp> f64vec1; + + /// Double-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f64, defaultp> f64vec2; + + /// Double-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f64, defaultp> f64vec3; + + /// Double-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f64, defaultp> f64vec4; +# endif//GLM_FORCE_SINGLE_ONLY + + + ////////////////////// + // Float matrix types + + /// Single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 fmat1; + + /// Single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, defaultp> fmat2; + + /// Single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, defaultp> fmat3; + + /// Single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, defaultp> fmat4; + + + /// Single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 fmat1x1; + + /// Single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, defaultp> fmat2x2; + + /// Single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, defaultp> fmat2x3; + + /// Single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, defaultp> fmat2x4; + + /// Single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, defaultp> fmat3x2; + + /// Single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, defaultp> fmat3x3; + + /// Single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, defaultp> fmat3x4; + + /// Single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, defaultp> fmat4x2; + + /// Single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, defaultp> fmat4x3; + + /// Single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, defaultp> fmat4x4; + + + /// Single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 f32mat1; + + /// Single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, defaultp> f32mat2; + + /// Single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, defaultp> f32mat3; + + /// Single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, defaultp> f32mat4; + + + /// Single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 f32mat1x1; + + /// Single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, defaultp> f32mat2x2; + + /// Single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, defaultp> f32mat2x3; + + /// Single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, defaultp> f32mat2x4; + + /// Single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, defaultp> f32mat3x2; + + /// Single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, defaultp> f32mat3x3; + + /// Single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, defaultp> f32mat3x4; + + /// Single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, defaultp> f32mat4x2; + + /// Single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, defaultp> f32mat4x3; + + /// Single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, defaultp> f32mat4x4; + + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 f64mat1; + + /// Double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f64, defaultp> f64mat2; + + /// Double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f64, defaultp> f64mat3; + + /// Double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f64, defaultp> f64mat4; + + + /// Double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f64 f64mat1x1; + + /// Double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f64, defaultp> f64mat2x2; + + /// Double-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f64, defaultp> f64mat2x3; + + /// Double-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f64, defaultp> f64mat2x4; + + /// Double-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f64, defaultp> f64mat3x2; + + /// Double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f64, defaultp> f64mat3x3; + + /// Double-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f64, defaultp> f64mat3x4; + + /// Double-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f64, defaultp> f64mat4x2; + + /// Double-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f64, defaultp> f64mat4x3; + + /// Double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f64, defaultp> f64mat4x4; + +# endif//GLM_FORCE_SINGLE_ONLY + + ////////////////////////// + // Quaternion types + + /// Single-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua f32quat; + + /// Low single-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua lowp_f32quat; + + /// Low double-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua lowp_f64quat; + + /// Medium single-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua mediump_f32quat; + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Medium double-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua mediump_f64quat; + + /// High single-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua highp_f32quat; + + /// High double-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua highp_f64quat; + + /// Double-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua f64quat; + +# endif//GLM_FORCE_SINGLE_ONLY + + /// @} +}//namespace glm + +#include "type_precision.inl" diff --git a/NothinFancy/dep/include/glm/gtc/type_precision.inl b/NothinFancy/dep/include/glm/gtc/type_precision.inl new file mode 100644 index 0000000..ae80912 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/type_precision.inl @@ -0,0 +1,6 @@ +/// @ref gtc_precision + +namespace glm +{ + +} diff --git a/NothinFancy/dep/include/glm/gtc/type_ptr.hpp b/NothinFancy/dep/include/glm/gtc/type_ptr.hpp new file mode 100644 index 0000000..d7e625a --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/type_ptr.hpp @@ -0,0 +1,230 @@ +/// @ref gtc_type_ptr +/// @file glm/gtc/type_ptr.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtc_type_ptr GLM_GTC_type_ptr +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Handles the interaction between pointers and vector, matrix types. +/// +/// This extension defines an overloaded function, glm::value_ptr. It returns +/// a pointer to the memory layout of the object. Matrix types store their values +/// in column-major order. +/// +/// This is useful for uploading data to matrices or copying data to buffer objects. +/// +/// Example: +/// @code +/// #include +/// #include +/// +/// glm::vec3 aVector(3); +/// glm::mat4 someMatrix(1.0); +/// +/// glUniform3fv(uniformLoc, 1, glm::value_ptr(aVector)); +/// glUniformMatrix4fv(uniformMatrixLoc, 1, GL_FALSE, glm::value_ptr(someMatrix)); +/// @endcode +/// +/// need to be included to use the features of this extension. + +#pragma once + +// Dependency: +#include "../gtc/quaternion.hpp" +#include "../gtc/vec1.hpp" +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../mat2x2.hpp" +#include "../mat2x3.hpp" +#include "../mat2x4.hpp" +#include "../mat3x2.hpp" +#include "../mat3x3.hpp" +#include "../mat3x4.hpp" +#include "../mat4x2.hpp" +#include "../mat4x3.hpp" +#include "../mat4x4.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_type_ptr extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_type_ptr + /// @{ + + /// Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL typename genType::value_type const * value_ptr(genType const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<2, T, defaultp> make_vec2(T const * const ptr); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<3, T, defaultp> make_vec3(T const * const ptr); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<4, T, defaultp> make_vec4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<2, 2, T, defaultp> make_mat2x2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<2, 3, T, defaultp> make_mat2x3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<2, 4, T, defaultp> make_mat2x4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<3, 2, T, defaultp> make_mat3x2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<3, 3, T, defaultp> make_mat3x3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<3, 4, T, defaultp> make_mat3x4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<4, 2, T, defaultp> make_mat4x2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<4, 3, T, defaultp> make_mat4x3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> make_mat4x4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<2, 2, T, defaultp> make_mat2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<3, 3, T, defaultp> make_mat3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> make_mat4(T const * const ptr); + + /// Build a quaternion from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL qua make_quat(T const * const ptr); + + /// @} +}//namespace glm + +#include "type_ptr.inl" diff --git a/NothinFancy/dep/include/glm/gtc/type_ptr.inl b/NothinFancy/dep/include/glm/gtc/type_ptr.inl new file mode 100644 index 0000000..71df4d3 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/type_ptr.inl @@ -0,0 +1,386 @@ +/// @ref gtc_type_ptr + +#include + +namespace glm +{ + /// @addtogroup gtc_type_ptr + /// @{ + + template + GLM_FUNC_QUALIFIER T const* value_ptr(vec<2, T, Q> const& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(vec<2, T, Q>& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T const * value_ptr(vec<3, T, Q> const& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(vec<3, T, Q>& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(vec<4, T, Q> const& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(vec<4, T, Q>& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 2, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<2, 2, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 3, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<3, 3, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 4, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<4, 4, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 3, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<2, 3, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 2, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<3, 2, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 4, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<2, 4, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 2, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<4, 2, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 4, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<3, 4, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 3, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T * value_ptr(mat<4, 3, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const * value_ptr(qua const& q) + { + return &(q[0]); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(qua& q) + { + return &(q[0]); + } + + template + inline vec<1, T, Q> make_vec1(vec<1, T, Q> const& v) + { + return v; + } + + template + inline vec<1, T, Q> make_vec1(vec<2, T, Q> const& v) + { + return vec<1, T, Q>(v); + } + + template + inline vec<1, T, Q> make_vec1(vec<3, T, Q> const& v) + { + return vec<1, T, Q>(v); + } + + template + inline vec<1, T, Q> make_vec1(vec<4, T, Q> const& v) + { + return vec<1, T, Q>(v); + } + + template + inline vec<2, T, Q> make_vec2(vec<1, T, Q> const& v) + { + return vec<2, T, Q>(v.x, static_cast(0)); + } + + template + inline vec<2, T, Q> make_vec2(vec<2, T, Q> const& v) + { + return v; + } + + template + inline vec<2, T, Q> make_vec2(vec<3, T, Q> const& v) + { + return vec<2, T, Q>(v); + } + + template + inline vec<2, T, Q> make_vec2(vec<4, T, Q> const& v) + { + return vec<2, T, Q>(v); + } + + template + inline vec<3, T, Q> make_vec3(vec<1, T, Q> const& v) + { + return vec<3, T, Q>(v.x, static_cast(0), static_cast(0)); + } + + template + inline vec<3, T, Q> make_vec3(vec<2, T, Q> const& v) + { + return vec<3, T, Q>(v.x, v.y, static_cast(0)); + } + + template + inline vec<3, T, Q> make_vec3(vec<3, T, Q> const& v) + { + return v; + } + + template + inline vec<3, T, Q> make_vec3(vec<4, T, Q> const& v) + { + return vec<3, T, Q>(v); + } + + template + inline vec<4, T, Q> make_vec4(vec<1, T, Q> const& v) + { + return vec<4, T, Q>(v.x, static_cast(0), static_cast(0), static_cast(1)); + } + + template + inline vec<4, T, Q> make_vec4(vec<2, T, Q> const& v) + { + return vec<4, T, Q>(v.x, v.y, static_cast(0), static_cast(1)); + } + + template + inline vec<4, T, Q> make_vec4(vec<3, T, Q> const& v) + { + return vec<4, T, Q>(v.x, v.y, v.z, static_cast(1)); + } + + template + inline vec<4, T, Q> make_vec4(vec<4, T, Q> const& v) + { + return v; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, defaultp> make_vec2(T const *const ptr) + { + vec<2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(vec<2, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, defaultp> make_vec3(T const *const ptr) + { + vec<3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(vec<3, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, defaultp> make_vec4(T const *const ptr) + { + vec<4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(vec<4, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> make_mat2x2(T const *const ptr) + { + mat<2, 2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<2, 2, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, defaultp> make_mat2x3(T const *const ptr) + { + mat<2, 3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<2, 3, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, defaultp> make_mat2x4(T const *const ptr) + { + mat<2, 4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<2, 4, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, defaultp> make_mat3x2(T const *const ptr) + { + mat<3, 2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<3, 2, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> make_mat3x3(T const *const ptr) + { + mat<3, 3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<3, 3, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, defaultp> make_mat3x4(T const *const ptr) + { + mat<3, 4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<3, 4, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, defaultp> make_mat4x2(T const *const ptr) + { + mat<4, 2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<4, 2, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, defaultp> make_mat4x3(T const *const ptr) + { + mat<4, 3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<4, 3, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> make_mat4x4(T const *const ptr) + { + mat<4, 4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<4, 4, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> make_mat2(T const *const ptr) + { + return make_mat2x2(ptr); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> make_mat3(T const *const ptr) + { + return make_mat3x3(ptr); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> make_mat4(T const *const ptr) + { + return make_mat4x4(ptr); + } + + template + GLM_FUNC_QUALIFIER qua make_quat(T const *const ptr) + { + qua Result; + memcpy(value_ptr(Result), ptr, sizeof(qua)); + return Result; + } + + /// @} +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/gtc/ulp.hpp b/NothinFancy/dep/include/glm/gtc/ulp.hpp new file mode 100644 index 0000000..0d80a75 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/ulp.hpp @@ -0,0 +1,152 @@ +/// @ref gtc_ulp +/// @file glm/gtc/ulp.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_ulp GLM_GTC_ulp +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Allow the measurement of the accuracy of a function against a reference +/// implementation. This extension works on floating-point data and provide results +/// in ULP. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_vectorize.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_ulp extension included") +#endif + +namespace glm +{ + /// Return the next ULP value(s) after the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL genType next_float(genType x); + + /// Return the previous ULP value(s) before the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL genType prev_float(genType x); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL genType next_float(genType x, int ULPs); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL genType prev_float(genType x, int ULPs); + + /// Return the distance in the number of ULP between 2 single-precision floating-point scalars. + /// + /// @see gtc_ulp + GLM_FUNC_DECL int float_distance(float x, float y); + + /// Return the distance in the number of ULP between 2 double-precision floating-point scalars. + /// + /// @see gtc_ulp + GLM_FUNC_DECL int64 float_distance(double x, double y); + + /// Return the next ULP value(s) after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec next_float(vec const& x); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec next_float(vec const& x, int ULPs); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec next_float(vec const& x, vec const& ULPs); + + /// Return the previous ULP value(s) before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec prev_float(vec const& x); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec prev_float(vec const& x, int ULPs); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec prev_float(vec const& x, vec const& ULPs); + + /// Return the distance in the number of ULP between 2 single-precision floating-point scalars. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec float_distance(vec const& x, vec const& y); + + /// Return the distance in the number of ULP between 2 double-precision floating-point scalars. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec float_distance(vec const& x, vec const& y); + + /// @} +}//namespace glm + +#include "ulp.inl" diff --git a/NothinFancy/dep/include/glm/gtc/ulp.inl b/NothinFancy/dep/include/glm/gtc/ulp.inl new file mode 100644 index 0000000..4ecbd3f --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/ulp.inl @@ -0,0 +1,173 @@ +/// @ref gtc_ulp + +#include "../ext/scalar_ulp.hpp" + +namespace glm +{ + template<> + GLM_FUNC_QUALIFIER float next_float(float x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::max()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafterf(x, FLT_MAX); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafterf(x, FLT_MAX); +# else + return nextafterf(x, FLT_MAX); +# endif + } + + template<> + GLM_FUNC_QUALIFIER double next_float(double x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::max()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafter(x, std::numeric_limits::max()); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafter(x, DBL_MAX); +# else + return nextafter(x, DBL_MAX); +# endif + } + + template + GLM_FUNC_QUALIFIER T next_float(T x, int ULPs) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'next_float' only accept floating-point input"); + assert(ULPs >= 0); + + T temp = x; + for (int i = 0; i < ULPs; ++i) + temp = next_float(temp); + return temp; + } + + GLM_FUNC_QUALIFIER float prev_float(float x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::min()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafterf(x, FLT_MIN); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafterf(x, FLT_MIN); +# else + return nextafterf(x, FLT_MIN); +# endif + } + + GLM_FUNC_QUALIFIER double prev_float(double x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::min()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return _nextafter(x, DBL_MIN); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafter(x, DBL_MIN); +# else + return nextafter(x, DBL_MIN); +# endif + } + + template + GLM_FUNC_QUALIFIER T prev_float(T x, int ULPs) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'prev_float' only accept floating-point input"); + assert(ULPs >= 0); + + T temp = x; + for (int i = 0; i < ULPs; ++i) + temp = prev_float(temp); + return temp; + } + + GLM_FUNC_QUALIFIER int float_distance(float x, float y) + { + detail::float_t const a(x); + detail::float_t const b(y); + + return abs(a.i - b.i); + } + + GLM_FUNC_QUALIFIER int64 float_distance(double x, double y) + { + detail::float_t const a(x); + detail::float_t const b(y); + + return abs(a.i - b.i); + } + + template + GLM_FUNC_QUALIFIER vec next_float(vec const& x) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = next_float(x[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec next_float(vec const& x, int ULPs) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = next_float(x[i], ULPs); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec next_float(vec const& x, vec const& ULPs) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = next_float(x[i], ULPs[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prev_float(vec const& x) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prev_float(x[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prev_float(vec const& x, int ULPs) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prev_float(x[i], ULPs); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prev_float(vec const& x, vec const& ULPs) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prev_float(x[i], ULPs[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec float_distance(vec const& x, vec const& y) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = float_distance(x[i], y[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec float_distance(vec const& x, vec const& y) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = float_distance(x[i], y[i]); + return Result; + } +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/gtc/vec1.hpp b/NothinFancy/dep/include/glm/gtc/vec1.hpp new file mode 100644 index 0000000..63697a2 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtc/vec1.hpp @@ -0,0 +1,30 @@ +/// @ref gtc_vec1 +/// @file glm/gtc/vec1.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_vec1 GLM_GTC_vec1 +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Add vec1, ivec1, uvec1 and bvec1 types. + +#pragma once + +// Dependency: +#include "../ext/vector_bool1.hpp" +#include "../ext/vector_bool1_precision.hpp" +#include "../ext/vector_float1.hpp" +#include "../ext/vector_float1_precision.hpp" +#include "../ext/vector_double1.hpp" +#include "../ext/vector_double1_precision.hpp" +#include "../ext/vector_int1.hpp" +#include "../ext/vector_int1_sized.hpp" +#include "../ext/vector_uint1.hpp" +#include "../ext/vector_uint1_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_vec1 extension included") +#endif + diff --git a/NothinFancy/dep/include/glm/gtx/associated_min_max.hpp b/NothinFancy/dep/include/glm/gtx/associated_min_max.hpp new file mode 100644 index 0000000..d1a41c0 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/associated_min_max.hpp @@ -0,0 +1,207 @@ +/// @ref gtx_associated_min_max +/// @file glm/gtx/associated_min_max.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_associated_min_max GLM_GTX_associated_min_max +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// @brief Min and max functions that return associated values not the compared onces. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_associated_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_associated_min_max extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_associated_min_max + /// @{ + + /// Minimum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMin(T x, U a, T y, U b); + + /// Minimum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec<2, U, Q> associatedMin( + vec const& x, vec const& a, + vec const& y, vec const& b); + + /// Minimum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + T x, const vec& a, + T y, const vec& b); + + /// Minimum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + vec const& x, U a, + vec const& y, U b); + + /// Minimum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMin( + T x, U a, + T y, U b, + T z, U c); + + /// Minimum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c); + + /// Minimum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMin( + T x, U a, + T y, U b, + T z, U c, + T w, U d); + + /// Minimum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c, + vec const& w, vec const& d); + + /// Minimum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c, + T w, vec const& d); + + /// Minimum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c, + vec const& w, U d); + + /// Maximum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMax(T x, U a, T y, U b); + + /// Maximum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec<2, U, Q> associatedMax( + vec const& x, vec const& a, + vec const& y, vec const& b); + + /// Maximum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + T x, vec const& a, + T y, vec const& b); + + /// Maximum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + vec const& x, U a, + vec const& y, U b); + + /// Maximum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMax( + T x, U a, + T y, U b, + T z, U c); + + /// Maximum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c); + + /// Maximum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c); + + /// Maximum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c); + + /// Maximum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMax( + T x, U a, + T y, U b, + T z, U c, + T w, U d); + + /// Maximum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c, + vec const& w, vec const& d); + + /// Maximum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c, + T w, vec const& d); + + /// Maximum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c, + vec const& w, U d); + + /// @} +} //namespace glm + +#include "associated_min_max.inl" diff --git a/NothinFancy/dep/include/glm/gtx/associated_min_max.inl b/NothinFancy/dep/include/glm/gtx/associated_min_max.inl new file mode 100644 index 0000000..5186c47 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/associated_min_max.inl @@ -0,0 +1,354 @@ +/// @ref gtx_associated_min_max + +namespace glm{ + +// Min comparison between 2 variables +template +GLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b) +{ + return x < y ? a : b; +} + +template +GLM_FUNC_QUALIFIER vec<2, U, Q> associatedMin +( + vec const& x, vec const& a, + vec const& y, vec const& b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] < y[i] ? a[i] : b[i]; + return Result; +} + +template +GLM_FUNC_QUALIFIER vec associatedMin +( + T x, const vec& a, + T y, const vec& b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x < y ? a[i] : b[i]; + return Result; +} + +template +GLM_FUNC_QUALIFIER vec associatedMin +( + vec const& x, U a, + vec const& y, U b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] < y[i] ? a : b; + return Result; +} + +// Min comparison between 3 variables +template +GLM_FUNC_QUALIFIER U associatedMin +( + T x, U a, + T y, U b, + T z, U c +) +{ + U Result = x < y ? (x < z ? a : c) : (y < z ? b : c); + return Result; +} + +template +GLM_FUNC_QUALIFIER vec associatedMin +( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]); + return Result; +} + +// Min comparison between 4 variables +template +GLM_FUNC_QUALIFIER U associatedMin +( + T x, U a, + T y, U b, + T z, U c, + T w, U d +) +{ + T Test1 = min(x, y); + T Test2 = min(z, w); + U Result1 = x < y ? a : b; + U Result2 = z < w ? c : d; + U Result = Test1 < Test2 ? Result1 : Result2; + return Result; +} + +// Min comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMin +( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c, + vec const& w, vec const& d +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + T Test1 = min(x[i], y[i]); + T Test2 = min(z[i], w[i]); + U Result1 = x[i] < y[i] ? a[i] : b[i]; + U Result2 = z[i] < w[i] ? c[i] : d[i]; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMin +( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c, + T w, vec const& d +) +{ + T Test1 = min(x, y); + T Test2 = min(z, w); + + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + U Result1 = x < y ? a[i] : b[i]; + U Result2 = z < w ? c[i] : d[i]; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMin +( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c, + vec const& w, U d +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + T Test1 = min(x[i], y[i]); + T Test2 = min(z[i], w[i]); + U Result1 = x[i] < y[i] ? a : b; + U Result2 = z[i] < w[i] ? c : d; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 2 variables +template +GLM_FUNC_QUALIFIER U associatedMax(T x, U a, T y, U b) +{ + return x > y ? a : b; +} + +// Max comparison between 2 variables +template +GLM_FUNC_QUALIFIER vec<2, U, Q> associatedMax +( + vec const& x, vec const& a, + vec const& y, vec const& b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] > y[i] ? a[i] : b[i]; + return Result; +} + +// Max comparison between 2 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + T x, vec const& a, + T y, vec const& b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x > y ? a[i] : b[i]; + return Result; +} + +// Max comparison between 2 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + vec const& x, U a, + vec const& y, U b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] > y[i] ? a : b; + return Result; +} + +// Max comparison between 3 variables +template +GLM_FUNC_QUALIFIER U associatedMax +( + T x, U a, + T y, U b, + T z, U c +) +{ + U Result = x > y ? (x > z ? a : c) : (y > z ? b : c); + return Result; +} + +// Max comparison between 3 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]); + return Result; +} + +// Max comparison between 3 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]); + return Result; +} + +// Max comparison between 3 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c); + return Result; +} + +// Max comparison between 4 variables +template +GLM_FUNC_QUALIFIER U associatedMax +( + T x, U a, + T y, U b, + T z, U c, + T w, U d +) +{ + T Test1 = max(x, y); + T Test2 = max(z, w); + U Result1 = x > y ? a : b; + U Result2 = z > w ? c : d; + U Result = Test1 > Test2 ? Result1 : Result2; + return Result; +} + +// Max comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c, + vec const& w, vec const& d +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + T Test1 = max(x[i], y[i]); + T Test2 = max(z[i], w[i]); + U Result1 = x[i] > y[i] ? a[i] : b[i]; + U Result2 = z[i] > w[i] ? c[i] : d[i]; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c, + T w, vec const& d +) +{ + T Test1 = max(x, y); + T Test2 = max(z, w); + + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + U Result1 = x > y ? a[i] : b[i]; + U Result2 = z > w ? c[i] : d[i]; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c, + vec const& w, U d +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + T Test1 = max(x[i], y[i]); + T Test2 = max(z[i], w[i]); + U Result1 = x[i] > y[i] ? a : b; + U Result2 = z[i] > w[i] ? c : d; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/bit.hpp b/NothinFancy/dep/include/glm/gtx/bit.hpp new file mode 100644 index 0000000..60a7aef --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/bit.hpp @@ -0,0 +1,98 @@ +/// @ref gtx_bit +/// @file glm/gtx/bit.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_bit GLM_GTX_bit +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../gtc/bitfield.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_bit is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_bit extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_bit + /// @{ + + /// @see gtx_bit + template + GLM_FUNC_DECL genIUType highestBitValue(genIUType Value); + + /// @see gtx_bit + template + GLM_FUNC_DECL genIUType lowestBitValue(genIUType Value); + + /// Find the highest bit set to 1 in a integer variable and return its value. + /// + /// @see gtx_bit + template + GLM_FUNC_DECL vec highestBitValue(vec const& value); + + /// Return the power of two number which value is just higher the input value. + /// Deprecated, use ceilPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoAbove(genIUType Value); + + /// Return the power of two number which value is just higher the input value. + /// Deprecated, use ceilPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL vec powerOfTwoAbove(vec const& value); + + /// Return the power of two number which value is just lower the input value. + /// Deprecated, use floorPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoBelow(genIUType Value); + + /// Return the power of two number which value is just lower the input value. + /// Deprecated, use floorPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL vec powerOfTwoBelow(vec const& value); + + /// Return the power of two number which value is the closet to the input value. + /// Deprecated, use roundPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoNearest(genIUType Value); + + /// Return the power of two number which value is the closet to the input value. + /// Deprecated, use roundPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL vec powerOfTwoNearest(vec const& value); + + /// @} +} //namespace glm + + +#include "bit.inl" + diff --git a/NothinFancy/dep/include/glm/gtx/bit.inl b/NothinFancy/dep/include/glm/gtx/bit.inl new file mode 100644 index 0000000..621b626 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/bit.inl @@ -0,0 +1,92 @@ +/// @ref gtx_bit + +namespace glm +{ + /////////////////// + // highestBitValue + + template + GLM_FUNC_QUALIFIER genIUType highestBitValue(genIUType Value) + { + genIUType tmp = Value; + genIUType result = genIUType(0); + while(tmp) + { + result = (tmp & (~tmp + 1)); // grab lowest bit + tmp &= ~result; // clear lowest bit + } + return result; + } + + template + GLM_FUNC_QUALIFIER vec highestBitValue(vec const& v) + { + return detail::functor1::call(highestBitValue, v); + } + + /////////////////// + // lowestBitValue + + template + GLM_FUNC_QUALIFIER genIUType lowestBitValue(genIUType Value) + { + return (Value & (~Value + 1)); + } + + template + GLM_FUNC_QUALIFIER vec lowestBitValue(vec const& v) + { + return detail::functor1::call(lowestBitValue, v); + } + + /////////////////// + // powerOfTwoAbove + + template + GLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType value) + { + return isPowerOfTwo(value) ? value : highestBitValue(value) << 1; + } + + template + GLM_FUNC_QUALIFIER vec powerOfTwoAbove(vec const& v) + { + return detail::functor1::call(powerOfTwoAbove, v); + } + + /////////////////// + // powerOfTwoBelow + + template + GLM_FUNC_QUALIFIER genType powerOfTwoBelow(genType value) + { + return isPowerOfTwo(value) ? value : highestBitValue(value); + } + + template + GLM_FUNC_QUALIFIER vec powerOfTwoBelow(vec const& v) + { + return detail::functor1::call(powerOfTwoBelow, v); + } + + ///////////////////// + // powerOfTwoNearest + + template + GLM_FUNC_QUALIFIER genType powerOfTwoNearest(genType value) + { + if(isPowerOfTwo(value)) + return value; + + genType const prev = highestBitValue(value); + genType const next = prev << 1; + return (next - value) < (value - prev) ? next : prev; + } + + template + GLM_FUNC_QUALIFIER vec powerOfTwoNearest(vec const& v) + { + return detail::functor1::call(powerOfTwoNearest, v); + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/closest_point.hpp b/NothinFancy/dep/include/glm/gtx/closest_point.hpp new file mode 100644 index 0000000..de6dbbf --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/closest_point.hpp @@ -0,0 +1,49 @@ +/// @ref gtx_closest_point +/// @file glm/gtx/closest_point.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_closest_point GLM_GTX_closest_point +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Find the point on a straight line which is the closet of a point. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_closest_point extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_closest_point + /// @{ + + /// Find the point on a straight line which is the closet of a point. + /// @see gtx_closest_point + template + GLM_FUNC_DECL vec<3, T, Q> closestPointOnLine( + vec<3, T, Q> const& point, + vec<3, T, Q> const& a, + vec<3, T, Q> const& b); + + /// 2d lines work as well + template + GLM_FUNC_DECL vec<2, T, Q> closestPointOnLine( + vec<2, T, Q> const& point, + vec<2, T, Q> const& a, + vec<2, T, Q> const& b); + + /// @} +}// namespace glm + +#include "closest_point.inl" diff --git a/NothinFancy/dep/include/glm/gtx/closest_point.inl b/NothinFancy/dep/include/glm/gtx/closest_point.inl new file mode 100644 index 0000000..0a39b04 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/closest_point.inl @@ -0,0 +1,45 @@ +/// @ref gtx_closest_point + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> closestPointOnLine + ( + vec<3, T, Q> const& point, + vec<3, T, Q> const& a, + vec<3, T, Q> const& b + ) + { + T LineLength = distance(a, b); + vec<3, T, Q> Vector = point - a; + vec<3, T, Q> LineDirection = (b - a) / LineLength; + + // Project Vector to LineDirection to get the distance of point from a + T Distance = dot(Vector, LineDirection); + + if(Distance <= T(0)) return a; + if(Distance >= LineLength) return b; + return a + LineDirection * Distance; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> closestPointOnLine + ( + vec<2, T, Q> const& point, + vec<2, T, Q> const& a, + vec<2, T, Q> const& b + ) + { + T LineLength = distance(a, b); + vec<2, T, Q> Vector = point - a; + vec<2, T, Q> LineDirection = (b - a) / LineLength; + + // Project Vector to LineDirection to get the distance of point from a + T Distance = dot(Vector, LineDirection); + + if(Distance <= T(0)) return a; + if(Distance >= LineLength) return b; + return a + LineDirection * Distance; + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/color_encoding.hpp b/NothinFancy/dep/include/glm/gtx/color_encoding.hpp new file mode 100644 index 0000000..96ded2a --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/color_encoding.hpp @@ -0,0 +1,54 @@ +/// @ref gtx_color_encoding +/// @file glm/gtx/color_encoding.hpp +/// +/// @see core (dependence) +/// @see gtx_color_encoding (dependence) +/// +/// @defgroup gtx_color_encoding GLM_GTX_color_encoding +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// @brief Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../vec3.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTC_color_encoding is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTC_color_encoding extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_color_encoding + /// @{ + + /// Convert a linear sRGB color to D65 YUV. + template + GLM_FUNC_DECL vec<3, T, Q> convertLinearSRGBToD65XYZ(vec<3, T, Q> const& ColorLinearSRGB); + + /// Convert a linear sRGB color to D50 YUV. + template + GLM_FUNC_DECL vec<3, T, Q> convertLinearSRGBToD50XYZ(vec<3, T, Q> const& ColorLinearSRGB); + + /// Convert a D65 YUV color to linear sRGB. + template + GLM_FUNC_DECL vec<3, T, Q> convertD65XYZToLinearSRGB(vec<3, T, Q> const& ColorD65XYZ); + + /// Convert a D65 YUV color to D50 YUV. + template + GLM_FUNC_DECL vec<3, T, Q> convertD65XYZToD50XYZ(vec<3, T, Q> const& ColorD65XYZ); + + /// @} +} //namespace glm + +#include "color_encoding.inl" diff --git a/NothinFancy/dep/include/glm/gtx/color_encoding.inl b/NothinFancy/dep/include/glm/gtx/color_encoding.inl new file mode 100644 index 0000000..e50fa3e --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/color_encoding.inl @@ -0,0 +1,45 @@ +/// @ref gtx_color_encoding + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> convertLinearSRGBToD65XYZ(vec<3, T, Q> const& ColorLinearSRGB) + { + vec<3, T, Q> const M(0.490f, 0.17697f, 0.2f); + vec<3, T, Q> const N(0.31f, 0.8124f, 0.01063f); + vec<3, T, Q> const O(0.490f, 0.01f, 0.99f); + + return (M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB) * static_cast(5.650675255693055f); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> convertLinearSRGBToD50XYZ(vec<3, T, Q> const& ColorLinearSRGB) + { + vec<3, T, Q> const M(0.436030342570117f, 0.222438466210245f, 0.013897440074263f); + vec<3, T, Q> const N(0.385101860087134f, 0.716942745571917f, 0.097076381494207f); + vec<3, T, Q> const O(0.143067806654203f, 0.060618777416563f, 0.713926257896652f); + + return M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> convertD65XYZToLinearSRGB(vec<3, T, Q> const& ColorD65XYZ) + { + vec<3, T, Q> const M(0.41847f, -0.091169f, 0.0009209f); + vec<3, T, Q> const N(-0.15866f, 0.25243f, 0.015708f); + vec<3, T, Q> const O(0.0009209f, -0.0025498f, 0.1786f); + + return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> convertD65XYZToD50XYZ(vec<3, T, Q> const& ColorD65XYZ) + { + vec<3, T, Q> const M(+1.047844353856414f, +0.029549007606644f, -0.009250984365223f); + vec<3, T, Q> const N(+0.022898981050086f, +0.990508028941971f, +0.015072338237051f); + vec<3, T, Q> const O(-0.050206647741605f, -0.017074711360960f, +0.751717835079977f); + + return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/color_space.hpp b/NothinFancy/dep/include/glm/gtx/color_space.hpp new file mode 100644 index 0000000..a634392 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/color_space.hpp @@ -0,0 +1,72 @@ +/// @ref gtx_color_space +/// @file glm/gtx/color_space.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_color_space GLM_GTX_color_space +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Related to RGB to HSV conversions and operations. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_color_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_color_space extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_color_space + /// @{ + + /// Converts a color from HSV color space to its color in RGB color space. + /// @see gtx_color_space + template + GLM_FUNC_DECL vec<3, T, Q> rgbColor( + vec<3, T, Q> const& hsvValue); + + /// Converts a color from RGB color space to its color in HSV color space. + /// @see gtx_color_space + template + GLM_FUNC_DECL vec<3, T, Q> hsvColor( + vec<3, T, Q> const& rgbValue); + + /// Build a saturation matrix. + /// @see gtx_color_space + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> saturation( + T const s); + + /// Modify the saturation of a color. + /// @see gtx_color_space + template + GLM_FUNC_DECL vec<3, T, Q> saturation( + T const s, + vec<3, T, Q> const& color); + + /// Modify the saturation of a color. + /// @see gtx_color_space + template + GLM_FUNC_DECL vec<4, T, Q> saturation( + T const s, + vec<4, T, Q> const& color); + + /// Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals. + /// @see gtx_color_space + template + GLM_FUNC_DECL T luminosity( + vec<3, T, Q> const& color); + + /// @} +}//namespace glm + +#include "color_space.inl" diff --git a/NothinFancy/dep/include/glm/gtx/color_space.inl b/NothinFancy/dep/include/glm/gtx/color_space.inl new file mode 100644 index 0000000..f698afe --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/color_space.inl @@ -0,0 +1,141 @@ +/// @ref gtx_color_space + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rgbColor(const vec<3, T, Q>& hsvColor) + { + vec<3, T, Q> hsv = hsvColor; + vec<3, T, Q> rgbColor; + + if(hsv.y == static_cast(0)) + // achromatic (grey) + rgbColor = vec<3, T, Q>(hsv.z); + else + { + T sector = floor(hsv.x * (T(1) / T(60))); + T frac = (hsv.x * (T(1) / T(60))) - sector; + // factorial part of h + T o = hsv.z * (T(1) - hsv.y); + T p = hsv.z * (T(1) - hsv.y * frac); + T q = hsv.z * (T(1) - hsv.y * (T(1) - frac)); + + switch(int(sector)) + { + default: + case 0: + rgbColor.r = hsv.z; + rgbColor.g = q; + rgbColor.b = o; + break; + case 1: + rgbColor.r = p; + rgbColor.g = hsv.z; + rgbColor.b = o; + break; + case 2: + rgbColor.r = o; + rgbColor.g = hsv.z; + rgbColor.b = q; + break; + case 3: + rgbColor.r = o; + rgbColor.g = p; + rgbColor.b = hsv.z; + break; + case 4: + rgbColor.r = q; + rgbColor.g = o; + rgbColor.b = hsv.z; + break; + case 5: + rgbColor.r = hsv.z; + rgbColor.g = o; + rgbColor.b = p; + break; + } + } + + return rgbColor; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> hsvColor(const vec<3, T, Q>& rgbColor) + { + vec<3, T, Q> hsv = rgbColor; + float Min = min(min(rgbColor.r, rgbColor.g), rgbColor.b); + float Max = max(max(rgbColor.r, rgbColor.g), rgbColor.b); + float Delta = Max - Min; + + hsv.z = Max; + + if(Max != static_cast(0)) + { + hsv.y = Delta / hsv.z; + T h = static_cast(0); + + if(rgbColor.r == Max) + // between yellow & magenta + h = static_cast(0) + T(60) * (rgbColor.g - rgbColor.b) / Delta; + else if(rgbColor.g == Max) + // between cyan & yellow + h = static_cast(120) + T(60) * (rgbColor.b - rgbColor.r) / Delta; + else + // between magenta & cyan + h = static_cast(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta; + + if(h < T(0)) + hsv.x = h + T(360); + else + hsv.x = h; + } + else + { + // If r = g = b = 0 then s = 0, h is undefined + hsv.y = static_cast(0); + hsv.x = static_cast(0); + } + + return hsv; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> saturation(T const s) + { + vec<3, T, defaultp> rgbw = vec<3, T, defaultp>(T(0.2126), T(0.7152), T(0.0722)); + + vec<3, T, defaultp> const col((T(1) - s) * rgbw); + + mat<4, 4, T, defaultp> result(T(1)); + result[0][0] = col.x + s; + result[0][1] = col.x; + result[0][2] = col.x; + result[1][0] = col.y; + result[1][1] = col.y + s; + result[1][2] = col.y; + result[2][0] = col.z; + result[2][1] = col.z; + result[2][2] = col.z + s; + + return result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> saturation(const T s, const vec<3, T, Q>& color) + { + return vec<3, T, Q>(saturation(s) * vec<4, T, Q>(color, T(0))); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> saturation(const T s, const vec<4, T, Q>& color) + { + return saturation(s) * color; + } + + template + GLM_FUNC_QUALIFIER T luminosity(const vec<3, T, Q>& color) + { + const vec<3, T, Q> tmp = vec<3, T, Q>(0.33, 0.59, 0.11); + return dot(color, tmp); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/color_space_YCoCg.hpp b/NothinFancy/dep/include/glm/gtx/color_space_YCoCg.hpp new file mode 100644 index 0000000..dd2b771 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/color_space_YCoCg.hpp @@ -0,0 +1,60 @@ +/// @ref gtx_color_space_YCoCg +/// @file glm/gtx/color_space_YCoCg.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_color_space_YCoCg GLM_GTX_color_space_YCoCg +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// RGB to YCoCg conversions and operations + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_color_space_YCoCg is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_color_space_YCoCg extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_color_space_YCoCg + /// @{ + + /// Convert a color from RGB color space to YCoCg color space. + /// @see gtx_color_space_YCoCg + template + GLM_FUNC_DECL vec<3, T, Q> rgb2YCoCg( + vec<3, T, Q> const& rgbColor); + + /// Convert a color from YCoCg color space to RGB color space. + /// @see gtx_color_space_YCoCg + template + GLM_FUNC_DECL vec<3, T, Q> YCoCg2rgb( + vec<3, T, Q> const& YCoCgColor); + + /// Convert a color from RGB color space to YCoCgR color space. + /// @see "YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range" + /// @see gtx_color_space_YCoCg + template + GLM_FUNC_DECL vec<3, T, Q> rgb2YCoCgR( + vec<3, T, Q> const& rgbColor); + + /// Convert a color from YCoCgR color space to RGB color space. + /// @see "YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range" + /// @see gtx_color_space_YCoCg + template + GLM_FUNC_DECL vec<3, T, Q> YCoCgR2rgb( + vec<3, T, Q> const& YCoCgColor); + + /// @} +}//namespace glm + +#include "color_space_YCoCg.inl" diff --git a/NothinFancy/dep/include/glm/gtx/color_space_YCoCg.inl b/NothinFancy/dep/include/glm/gtx/color_space_YCoCg.inl new file mode 100644 index 0000000..83ba857 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/color_space_YCoCg.inl @@ -0,0 +1,107 @@ +/// @ref gtx_color_space_YCoCg + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCg + ( + vec<3, T, Q> const& rgbColor + ) + { + vec<3, T, Q> result; + result.x/*Y */ = rgbColor.r / T(4) + rgbColor.g / T(2) + rgbColor.b / T(4); + result.y/*Co*/ = rgbColor.r / T(2) + rgbColor.g * T(0) - rgbColor.b / T(2); + result.z/*Cg*/ = - rgbColor.r / T(4) + rgbColor.g / T(2) - rgbColor.b / T(4); + return result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCg2rgb + ( + vec<3, T, Q> const& YCoCgColor + ) + { + vec<3, T, Q> result; + result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z; + result.g = YCoCgColor.x + YCoCgColor.z; + result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z; + return result; + } + + template + class compute_YCoCgR { + public: + static GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR + ( + vec<3, T, Q> const& rgbColor + ) + { + vec<3, T, Q> result; + result.x/*Y */ = rgbColor.g * static_cast(0.5) + (rgbColor.r + rgbColor.b) * static_cast(0.25); + result.y/*Co*/ = rgbColor.r - rgbColor.b; + result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) * static_cast(0.5); + return result; + } + + static GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb + ( + vec<3, T, Q> const& YCoCgRColor + ) + { + vec<3, T, Q> result; + T tmp = YCoCgRColor.x - (YCoCgRColor.z * static_cast(0.5)); + result.g = YCoCgRColor.z + tmp; + result.b = tmp - (YCoCgRColor.y * static_cast(0.5)); + result.r = result.b + YCoCgRColor.y; + return result; + } + }; + + template + class compute_YCoCgR { + public: + static GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR + ( + vec<3, T, Q> const& rgbColor + ) + { + vec<3, T, Q> result; + result.y/*Co*/ = rgbColor.r - rgbColor.b; + T tmp = rgbColor.b + (result.y >> 1); + result.z/*Cg*/ = rgbColor.g - tmp; + result.x/*Y */ = tmp + (result.z >> 1); + return result; + } + + static GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb + ( + vec<3, T, Q> const& YCoCgRColor + ) + { + vec<3, T, Q> result; + T tmp = YCoCgRColor.x - (YCoCgRColor.z >> 1); + result.g = YCoCgRColor.z + tmp; + result.b = tmp - (YCoCgRColor.y >> 1); + result.r = result.b + YCoCgRColor.y; + return result; + } + }; + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR + ( + vec<3, T, Q> const& rgbColor + ) + { + return compute_YCoCgR::is_integer>::rgb2YCoCgR(rgbColor); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb + ( + vec<3, T, Q> const& YCoCgRColor + ) + { + return compute_YCoCgR::is_integer>::YCoCgR2rgb(YCoCgRColor); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/common.hpp b/NothinFancy/dep/include/glm/gtx/common.hpp new file mode 100644 index 0000000..254ada2 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/common.hpp @@ -0,0 +1,76 @@ +/// @ref gtx_common +/// @file glm/gtx/common.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_common GLM_GTX_common +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// @brief Provide functions to increase the compatibility with Cg and HLSL languages + +#pragma once + +// Dependencies: +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../gtc/vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_common is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_common extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_common + /// @{ + + /// Returns true if x is a denormalized number + /// Numbers whose absolute value is too small to be represented in the normal format are represented in an alternate, denormalized format. + /// This format is less precise but can represent values closer to zero. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL isnan man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL typename genType::bool_type isdenormal(genType const& x); + + /// Similar to 'mod' but with a different rounding and integer support. + /// Returns 'x - y * trunc(x/y)' instead of 'x - y * floor(x/y)' + /// + /// @see GLSL mod vs HLSL fmod + /// @see GLSL mod man page + template + GLM_FUNC_DECL vec fmod(vec const& v); + + /// Returns whether vector components values are within an interval. A open interval excludes its endpoints, and is denoted with square brackets. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_relational + template + GLM_FUNC_DECL vec openBounded(vec const& Value, vec const& Min, vec const& Max); + + /// Returns whether vector components values are within an interval. A closed interval includes its endpoints, and is denoted with square brackets. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_relational + template + GLM_FUNC_DECL vec closeBounded(vec const& Value, vec const& Min, vec const& Max); + + /// @} +}//namespace glm + +#include "common.inl" diff --git a/NothinFancy/dep/include/glm/gtx/common.inl b/NothinFancy/dep/include/glm/gtx/common.inl new file mode 100644 index 0000000..4ad2126 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/common.inl @@ -0,0 +1,125 @@ +/// @ref gtx_common + +#include +#include "../gtc/epsilon.hpp" +#include "../gtc/constants.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_fmod + { + GLM_FUNC_QUALIFIER static vec call(vec const& a, vec const& b) + { + return detail::functor2::call(std::fmod, a, b); + } + }; + + template + struct compute_fmod + { + GLM_FUNC_QUALIFIER static vec call(vec const& a, vec const& b) + { + return a % b; + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER bool isdenormal(T const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isdenormal' only accept floating-point inputs"); + +# if GLM_HAS_CXX11_STL + return std::fpclassify(x) == FP_SUBNORMAL; +# else + return epsilonNotEqual(x, static_cast(0), epsilon()) && std::fabs(x) < std::numeric_limits::min(); +# endif + } + + template + GLM_FUNC_QUALIFIER typename vec<1, T, Q>::bool_type isdenormal + ( + vec<1, T, Q> const& x + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isdenormal' only accept floating-point inputs"); + + return typename vec<1, T, Q>::bool_type( + isdenormal(x.x)); + } + + template + GLM_FUNC_QUALIFIER typename vec<2, T, Q>::bool_type isdenormal + ( + vec<2, T, Q> const& x + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isdenormal' only accept floating-point inputs"); + + return typename vec<2, T, Q>::bool_type( + isdenormal(x.x), + isdenormal(x.y)); + } + + template + GLM_FUNC_QUALIFIER typename vec<3, T, Q>::bool_type isdenormal + ( + vec<3, T, Q> const& x + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isdenormal' only accept floating-point inputs"); + + return typename vec<3, T, Q>::bool_type( + isdenormal(x.x), + isdenormal(x.y), + isdenormal(x.z)); + } + + template + GLM_FUNC_QUALIFIER typename vec<4, T, Q>::bool_type isdenormal + ( + vec<4, T, Q> const& x + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isdenormal' only accept floating-point inputs"); + + return typename vec<4, T, Q>::bool_type( + isdenormal(x.x), + isdenormal(x.y), + isdenormal(x.z), + isdenormal(x.w)); + } + + // fmod + template + GLM_FUNC_QUALIFIER genType fmod(genType x, genType y) + { + return fmod(vec<1, genType>(x), y).x; + } + + template + GLM_FUNC_QUALIFIER vec fmod(vec const& x, T y) + { + return detail::compute_fmod::is_iec559>::call(x, vec(y)); + } + + template + GLM_FUNC_QUALIFIER vec fmod(vec const& x, vec const& y) + { + return detail::compute_fmod::is_iec559>::call(x, y); + } + + template + GLM_FUNC_QUALIFIER vec openBounded(vec const& Value, vec const& Min, vec const& Max) + { + return greaterThan(Value, Min) && lessThan(Value, Max); + } + + template + GLM_FUNC_QUALIFIER vec closeBounded(vec const& Value, vec const& Min, vec const& Max) + { + return greaterThanEqual(Value, Min) && lessThanEqual(Value, Max); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/compatibility.hpp b/NothinFancy/dep/include/glm/gtx/compatibility.hpp new file mode 100644 index 0000000..f1b00a6 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/compatibility.hpp @@ -0,0 +1,133 @@ +/// @ref gtx_compatibility +/// @file glm/gtx/compatibility.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_compatibility GLM_GTX_compatibility +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Provide functions to increase the compatibility with Cg and HLSL languages + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/quaternion.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_compatibility is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_compatibility extension included") +# endif +#endif + +#if GLM_COMPILER & GLM_COMPILER_VC +# include +#elif GLM_COMPILER & GLM_COMPILER_GCC +# include +# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID) +# undef isfinite +# endif +#endif//GLM_COMPILER + +namespace glm +{ + /// @addtogroup gtx_compatibility + /// @{ + + template GLM_FUNC_QUALIFIER T lerp(T x, T y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<2, T, Q> lerp(const vec<2, T, Q>& x, const vec<2, T, Q>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + + template GLM_FUNC_QUALIFIER vec<3, T, Q> lerp(const vec<3, T, Q>& x, const vec<3, T, Q>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<4, T, Q> lerp(const vec<4, T, Q>& x, const vec<4, T, Q>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<2, T, Q> lerp(const vec<2, T, Q>& x, const vec<2, T, Q>& y, const vec<2, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<3, T, Q> lerp(const vec<3, T, Q>& x, const vec<3, T, Q>& y, const vec<3, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<4, T, Q> lerp(const vec<4, T, Q>& x, const vec<4, T, Q>& y, const vec<4, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + + template GLM_FUNC_QUALIFIER T saturate(T x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<2, T, Q> saturate(const vec<2, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<3, T, Q> saturate(const vec<3, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<4, T, Q> saturate(const vec<4, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + + template GLM_FUNC_QUALIFIER T atan2(T x, T y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<2, T, Q> atan2(const vec<2, T, Q>& x, const vec<2, T, Q>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<3, T, Q> atan2(const vec<3, T, Q>& x, const vec<3, T, Q>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<4, T, Q> atan2(const vec<4, T, Q>& x, const vec<4, T, Q>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + + template GLM_FUNC_DECL bool isfinite(genType const& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template GLM_FUNC_DECL vec<1, bool, Q> isfinite(const vec<1, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template GLM_FUNC_DECL vec<2, bool, Q> isfinite(const vec<2, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template GLM_FUNC_DECL vec<3, bool, Q> isfinite(const vec<3, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template GLM_FUNC_DECL vec<4, bool, Q> isfinite(const vec<4, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + + typedef bool bool1; //!< \brief boolean type with 1 component. (From GLM_GTX_compatibility extension) + typedef vec<2, bool, highp> bool2; //!< \brief boolean type with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, bool, highp> bool3; //!< \brief boolean type with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, bool, highp> bool4; //!< \brief boolean type with 4 components. (From GLM_GTX_compatibility extension) + + typedef bool bool1x1; //!< \brief boolean matrix with 1 x 1 component. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, bool, highp> bool2x2; //!< \brief boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, bool, highp> bool2x3; //!< \brief boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, bool, highp> bool2x4; //!< \brief boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, bool, highp> bool3x2; //!< \brief boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, bool, highp> bool3x3; //!< \brief boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, bool, highp> bool3x4; //!< \brief boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, bool, highp> bool4x2; //!< \brief boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, bool, highp> bool4x3; //!< \brief boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, bool, highp> bool4x4; //!< \brief boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef int int1; //!< \brief integer vector with 1 component. (From GLM_GTX_compatibility extension) + typedef vec<2, int, highp> int2; //!< \brief integer vector with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, int, highp> int3; //!< \brief integer vector with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, int, highp> int4; //!< \brief integer vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef int int1x1; //!< \brief integer matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, int, highp> int2x2; //!< \brief integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, int, highp> int2x3; //!< \brief integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, int, highp> int2x4; //!< \brief integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, int, highp> int3x2; //!< \brief integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, int, highp> int3x3; //!< \brief integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, int, highp> int3x4; //!< \brief integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, int, highp> int4x2; //!< \brief integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, int, highp> int4x3; //!< \brief integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, int, highp> int4x4; //!< \brief integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef float float1; //!< \brief single-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) + typedef vec<2, float, highp> float2; //!< \brief single-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, float, highp> float3; //!< \brief single-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, float, highp> float4; //!< \brief single-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef float float1x1; //!< \brief single-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, float, highp> float2x2; //!< \brief single-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, float, highp> float2x3; //!< \brief single-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, float, highp> float2x4; //!< \brief single-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, float, highp> float3x2; //!< \brief single-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, float, highp> float3x3; //!< \brief single-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, float, highp> float3x4; //!< \brief single-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, float, highp> float4x2; //!< \brief single-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, float, highp> float4x3; //!< \brief single-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, float, highp> float4x4; //!< \brief single-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef double double1; //!< \brief double-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) + typedef vec<2, double, highp> double2; //!< \brief double-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, double, highp> double3; //!< \brief double-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, double, highp> double4; //!< \brief double-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef double double1x1; //!< \brief double-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, double, highp> double2x2; //!< \brief double-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, double, highp> double2x3; //!< \brief double-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, double, highp> double2x4; //!< \brief double-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, double, highp> double3x2; //!< \brief double-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, double, highp> double3x3; //!< \brief double-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, double, highp> double3x4; //!< \brief double-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, double, highp> double4x2; //!< \brief double-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, double, highp> double4x3; //!< \brief double-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, double, highp> double4x4; //!< \brief double-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + /// @} +}//namespace glm + +#include "compatibility.inl" diff --git a/NothinFancy/dep/include/glm/gtx/compatibility.inl b/NothinFancy/dep/include/glm/gtx/compatibility.inl new file mode 100644 index 0000000..1d49496 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/compatibility.inl @@ -0,0 +1,62 @@ +#include + +namespace glm +{ + // isfinite + template + GLM_FUNC_QUALIFIER bool isfinite( + genType const& x) + { +# if GLM_HAS_CXX11_STL + return std::isfinite(x) != 0; +# elif GLM_COMPILER & GLM_COMPILER_VC + return _finite(x) != 0; +# elif GLM_COMPILER & GLM_COMPILER_GCC && GLM_PLATFORM & GLM_PLATFORM_ANDROID + return _isfinite(x) != 0; +# else + if (std::numeric_limits::is_integer || std::denorm_absent == std::numeric_limits::has_denorm) + return std::numeric_limits::min() <= x && std::numeric_limits::max() >= x; + else + return -std::numeric_limits::max() <= x && std::numeric_limits::max() >= x; +# endif + } + + template + GLM_FUNC_QUALIFIER vec<1, bool, Q> isfinite( + vec<1, T, Q> const& x) + { + return vec<1, bool, Q>( + isfinite(x.x)); + } + + template + GLM_FUNC_QUALIFIER vec<2, bool, Q> isfinite( + vec<2, T, Q> const& x) + { + return vec<2, bool, Q>( + isfinite(x.x), + isfinite(x.y)); + } + + template + GLM_FUNC_QUALIFIER vec<3, bool, Q> isfinite( + vec<3, T, Q> const& x) + { + return vec<3, bool, Q>( + isfinite(x.x), + isfinite(x.y), + isfinite(x.z)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> isfinite( + vec<4, T, Q> const& x) + { + return vec<4, bool, Q>( + isfinite(x.x), + isfinite(x.y), + isfinite(x.z), + isfinite(x.w)); + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/component_wise.hpp b/NothinFancy/dep/include/glm/gtx/component_wise.hpp new file mode 100644 index 0000000..34a2b0a --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/component_wise.hpp @@ -0,0 +1,69 @@ +/// @ref gtx_component_wise +/// @file glm/gtx/component_wise.hpp +/// @date 2007-05-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_component_wise GLM_GTX_component_wise +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Operations between components of a type + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_component_wise is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_component_wise extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_component_wise + /// @{ + + /// Convert an integer vector to a normalized float vector. + /// If the parameter value type is already a floating qualifier type, the value is passed through. + /// @see gtx_component_wise + template + GLM_FUNC_DECL vec compNormalize(vec const& v); + + /// Convert a normalized float vector to an integer vector. + /// If the parameter value type is already a floating qualifier type, the value is passed through. + /// @see gtx_component_wise + template + GLM_FUNC_DECL vec compScale(vec const& v); + + /// Add all vector components together. + /// @see gtx_component_wise + template + GLM_FUNC_DECL typename genType::value_type compAdd(genType const& v); + + /// Multiply all vector components together. + /// @see gtx_component_wise + template + GLM_FUNC_DECL typename genType::value_type compMul(genType const& v); + + /// Find the minimum value between single vector components. + /// @see gtx_component_wise + template + GLM_FUNC_DECL typename genType::value_type compMin(genType const& v); + + /// Find the maximum value between single vector components. + /// @see gtx_component_wise + template + GLM_FUNC_DECL typename genType::value_type compMax(genType const& v); + + /// @} +}//namespace glm + +#include "component_wise.inl" diff --git a/NothinFancy/dep/include/glm/gtx/component_wise.inl b/NothinFancy/dep/include/glm/gtx/component_wise.inl new file mode 100644 index 0000000..cbbc7d4 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/component_wise.inl @@ -0,0 +1,127 @@ +/// @ref gtx_component_wise + +#include + +namespace glm{ +namespace detail +{ + template + struct compute_compNormalize + {}; + + template + struct compute_compNormalize + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + floatType const Min = static_cast(std::numeric_limits::min()); + floatType const Max = static_cast(std::numeric_limits::max()); + return (vec(v) - Min) / (Max - Min) * static_cast(2) - static_cast(1); + } + }; + + template + struct compute_compNormalize + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + return vec(v) / static_cast(std::numeric_limits::max()); + } + }; + + template + struct compute_compNormalize + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + return v; + } + }; + + template + struct compute_compScale + {}; + + template + struct compute_compScale + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + floatType const Max = static_cast(std::numeric_limits::max()) + static_cast(0.5); + vec const Scaled(v * Max); + vec const Result(Scaled - static_cast(0.5)); + return Result; + } + }; + + template + struct compute_compScale + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + return vec(vec(v) * static_cast(std::numeric_limits::max())); + } + }; + + template + struct compute_compScale + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + return v; + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER vec compNormalize(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'compNormalize' accepts only floating-point types for 'floatType' template parameter"); + + return detail::compute_compNormalize::is_integer, std::numeric_limits::is_signed>::call(v); + } + + template + GLM_FUNC_QUALIFIER vec compScale(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'compScale' accepts only floating-point types for 'floatType' template parameter"); + + return detail::compute_compScale::is_integer, std::numeric_limits::is_signed>::call(v); + } + + template + GLM_FUNC_QUALIFIER T compAdd(vec const& v) + { + T Result(0); + for(length_t i = 0, n = v.length(); i < n; ++i) + Result += v[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER T compMul(vec const& v) + { + T Result(1); + for(length_t i = 0, n = v.length(); i < n; ++i) + Result *= v[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER T compMin(vec const& v) + { + T Result(v[0]); + for(length_t i = 1, n = v.length(); i < n; ++i) + Result = min(Result, v[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER T compMax(vec const& v) + { + T Result(v[0]); + for(length_t i = 1, n = v.length(); i < n; ++i) + Result = max(Result, v[i]); + return Result; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/dual_quaternion.hpp b/NothinFancy/dep/include/glm/gtx/dual_quaternion.hpp new file mode 100644 index 0000000..6a51ab7 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/dual_quaternion.hpp @@ -0,0 +1,274 @@ +/// @ref gtx_dual_quaternion +/// @file glm/gtx/dual_quaternion.hpp +/// @author Maksim Vorobiev (msomeone@gmail.com) +/// +/// @see core (dependence) +/// @see gtc_constants (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_dual_quaternion GLM_GTX_dual_quaternion +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defines a templated dual-quaternion type and several dual-quaternion operations. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/constants.hpp" +#include "../gtc/quaternion.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_dual_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_dual_quaternion extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_dual_quaternion + /// @{ + + template + struct tdualquat + { + // -- Implementation detail -- + + typedef T value_type; + typedef qua part_type; + + // -- Data -- + + qua real, dual; + + // -- Component accesses -- + + typedef length_t length_type; + /// Return the count of components of a dual quaternion + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 2;} + + GLM_FUNC_DECL part_type & operator[](length_type i); + GLM_FUNC_DECL part_type const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat const& d) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat const& d); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(qua const& real); + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(qua const& orientation, vec<3, T, Q> const& translation); + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(qua const& real, qua const& dual); + + // -- Conversion constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tdualquat(tdualquat const& q); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR tdualquat(mat<2, 4, T, Q> const& holder_mat); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR tdualquat(mat<3, 4, T, Q> const& aug_mat); + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL tdualquat & operator=(tdualquat const& m) GLM_DEFAULT; + + template + GLM_FUNC_DECL tdualquat & operator=(tdualquat const& m); + template + GLM_FUNC_DECL tdualquat & operator*=(U s); + template + GLM_FUNC_DECL tdualquat & operator/=(U s); + }; + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL tdualquat operator+(tdualquat const& q); + + template + GLM_FUNC_DECL tdualquat operator-(tdualquat const& q); + + // -- Binary operators -- + + template + GLM_FUNC_DECL tdualquat operator+(tdualquat const& q, tdualquat const& p); + + template + GLM_FUNC_DECL tdualquat operator*(tdualquat const& q, tdualquat const& p); + + template + GLM_FUNC_DECL vec<3, T, Q> operator*(tdualquat const& q, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v, tdualquat const& q); + + template + GLM_FUNC_DECL vec<4, T, Q> operator*(tdualquat const& q, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v, tdualquat const& q); + + template + GLM_FUNC_DECL tdualquat operator*(tdualquat const& q, T const& s); + + template + GLM_FUNC_DECL tdualquat operator*(T const& s, tdualquat const& q); + + template + GLM_FUNC_DECL tdualquat operator/(tdualquat const& q, T const& s); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(tdualquat const& q1, tdualquat const& q2); + + template + GLM_FUNC_DECL bool operator!=(tdualquat const& q1, tdualquat const& q2); + + /// Creates an identity dual quaternion. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL tdualquat dual_quat_identity(); + + /// Returns the normalized quaternion. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL tdualquat normalize(tdualquat const& q); + + /// Returns the linear interpolation of two dual quaternion. + /// + /// @see gtc_dual_quaternion + template + GLM_FUNC_DECL tdualquat lerp(tdualquat const& x, tdualquat const& y, T const& a); + + /// Returns the q inverse. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL tdualquat inverse(tdualquat const& q); + + /// Converts a quaternion to a 2 * 4 matrix. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL mat<2, 4, T, Q> mat2x4_cast(tdualquat const& x); + + /// Converts a quaternion to a 3 * 4 matrix. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL mat<3, 4, T, Q> mat3x4_cast(tdualquat const& x); + + /// Converts a 2 * 4 matrix (matrix which holds real and dual parts) to a quaternion. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL tdualquat dualquat_cast(mat<2, 4, T, Q> const& x); + + /// Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL tdualquat dualquat_cast(mat<3, 4, T, Q> const& x); + + + /// Dual-quaternion of low single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat lowp_dualquat; + + /// Dual-quaternion of medium single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat mediump_dualquat; + + /// Dual-quaternion of high single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat highp_dualquat; + + + /// Dual-quaternion of low single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat lowp_fdualquat; + + /// Dual-quaternion of medium single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat mediump_fdualquat; + + /// Dual-quaternion of high single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat highp_fdualquat; + + + /// Dual-quaternion of low double-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat lowp_ddualquat; + + /// Dual-quaternion of medium double-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat mediump_ddualquat; + + /// Dual-quaternion of high double-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat highp_ddualquat; + + +#if(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) + /// Dual-quaternion of floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef highp_fdualquat dualquat; + + /// Dual-quaternion of single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef highp_fdualquat fdualquat; +#elif(defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) + typedef highp_fdualquat dualquat; + typedef highp_fdualquat fdualquat; +#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) + typedef mediump_fdualquat dualquat; + typedef mediump_fdualquat fdualquat; +#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT)) + typedef lowp_fdualquat dualquat; + typedef lowp_fdualquat fdualquat; +#else +# error "GLM error: multiple default precision requested for single-precision floating-point types" +#endif + + +#if(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) + /// Dual-quaternion of default double-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef highp_ddualquat ddualquat; +#elif(defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) + typedef highp_ddualquat ddualquat; +#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) + typedef mediump_ddualquat ddualquat; +#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && defined(GLM_PRECISION_LOWP_DOUBLE)) + typedef lowp_ddualquat ddualquat; +#else +# error "GLM error: Multiple default precision requested for double-precision floating-point types" +#endif + + /// @} +} //namespace glm + +#include "dual_quaternion.inl" diff --git a/NothinFancy/dep/include/glm/gtx/dual_quaternion.inl b/NothinFancy/dep/include/glm/gtx/dual_quaternion.inl new file mode 100644 index 0000000..fad07ea --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/dual_quaternion.inl @@ -0,0 +1,352 @@ +/// @ref gtx_dual_quaternion + +#include "../geometric.hpp" +#include + +namespace glm +{ + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER typename tdualquat::part_type & tdualquat::operator[](typename tdualquat::length_type i) + { + assert(i >= 0 && i < this->length()); + return (&real)[i]; + } + + template + GLM_FUNC_QUALIFIER typename tdualquat::part_type const& tdualquat::operator[](typename tdualquat::length_type i) const + { + assert(i >= 0 && i < this->length()); + return (&real)[i]; + } + + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat() +# if GLM_CONFIG_DEFAULTED_FUNCTIONS != GLM_DISABLE + : real(qua()) + , dual(qua(0, 0, 0, 0)) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(tdualquat const& d) + : real(d.real) + , dual(d.dual) + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(tdualquat const& d) + : real(d.real) + , dual(d.dual) + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(qua const& r) + : real(r), dual(qua(0, 0, 0, 0)) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(qua const& q, vec<3, T, Q> const& p) + : real(q), dual( + T(-0.5) * ( p.x*q.x + p.y*q.y + p.z*q.z), + T(+0.5) * ( p.x*q.w + p.y*q.z - p.z*q.y), + T(+0.5) * (-p.x*q.z + p.y*q.w + p.z*q.x), + T(+0.5) * ( p.x*q.y - p.y*q.x + p.z*q.w)) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(qua const& r, qua const& d) + : real(r), dual(d) + {} + + // -- Conversion constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(tdualquat const& q) + : real(q.real) + , dual(q.dual) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(mat<2, 4, T, Q> const& m) + { + *this = dualquat_cast(m); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(mat<3, 4, T, Q> const& m) + { + *this = dualquat_cast(m); + } + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER tdualquat & tdualquat::operator=(tdualquat const& q) + { + this->real = q.real; + this->dual = q.dual; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER tdualquat & tdualquat::operator=(tdualquat const& q) + { + this->real = q.real; + this->dual = q.dual; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER tdualquat & tdualquat::operator*=(U s) + { + this->real *= static_cast(s); + this->dual *= static_cast(s); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER tdualquat & tdualquat::operator/=(U s) + { + this->real /= static_cast(s); + this->dual /= static_cast(s); + return *this; + } + + // -- Unary bit operators -- + + template + GLM_FUNC_QUALIFIER tdualquat operator+(tdualquat const& q) + { + return q; + } + + template + GLM_FUNC_QUALIFIER tdualquat operator-(tdualquat const& q) + { + return tdualquat(-q.real, -q.dual); + } + + // -- Binary operators -- + + template + GLM_FUNC_QUALIFIER tdualquat operator+(tdualquat const& q, tdualquat const& p) + { + return tdualquat(q.real + p.real,q.dual + p.dual); + } + + template + GLM_FUNC_QUALIFIER tdualquat operator*(tdualquat const& p, tdualquat const& o) + { + return tdualquat(p.real * o.real,p.real * o.dual + p.dual * o.real); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(tdualquat const& q, vec<3, T, Q> const& v) + { + vec<3, T, Q> const real_v3(q.real.x,q.real.y,q.real.z); + vec<3, T, Q> const dual_v3(q.dual.x,q.dual.y,q.dual.z); + return (cross(real_v3, cross(real_v3,v) + v * q.real.w + dual_v3) + dual_v3 * q.real.w - real_v3 * q.dual.w) * T(2) + v; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v, tdualquat const& q) + { + return glm::inverse(q) * v; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(tdualquat const& q, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(q * vec<3, T, Q>(v), v.w); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v, tdualquat const& q) + { + return glm::inverse(q) * v; + } + + template + GLM_FUNC_QUALIFIER tdualquat operator*(tdualquat const& q, T const& s) + { + return tdualquat(q.real * s, q.dual * s); + } + + template + GLM_FUNC_QUALIFIER tdualquat operator*(T const& s, tdualquat const& q) + { + return q * s; + } + + template + GLM_FUNC_QUALIFIER tdualquat operator/(tdualquat const& q, T const& s) + { + return tdualquat(q.real / s, q.dual / s); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(tdualquat const& q1, tdualquat const& q2) + { + return (q1.real == q2.real) && (q1.dual == q2.dual); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(tdualquat const& q1, tdualquat const& q2) + { + return (q1.real != q2.real) || (q1.dual != q2.dual); + } + + // -- Operations -- + + template + GLM_FUNC_QUALIFIER tdualquat dual_quat_identity() + { + return tdualquat( + qua(static_cast(1), static_cast(0), static_cast(0), static_cast(0)), + qua(static_cast(0), static_cast(0), static_cast(0), static_cast(0))); + } + + template + GLM_FUNC_QUALIFIER tdualquat normalize(tdualquat const& q) + { + return q / length(q.real); + } + + template + GLM_FUNC_QUALIFIER tdualquat lerp(tdualquat const& x, tdualquat const& y, T const& a) + { + // Dual Quaternion Linear blend aka DLB: + // Lerp is only defined in [0, 1] + assert(a >= static_cast(0)); + assert(a <= static_cast(1)); + T const k = dot(x.real,y.real) < static_cast(0) ? -a : a; + T const one(1); + return tdualquat(x * (one - a) + y * k); + } + + template + GLM_FUNC_QUALIFIER tdualquat inverse(tdualquat const& q) + { + const glm::qua real = conjugate(q.real); + const glm::qua dual = conjugate(q.dual); + return tdualquat(real, dual + (real * (-2.0f * dot(real,dual)))); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat2x4_cast(tdualquat const& x) + { + return mat<2, 4, T, Q>( x[0].x, x[0].y, x[0].z, x[0].w, x[1].x, x[1].y, x[1].z, x[1].w ); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat3x4_cast(tdualquat const& x) + { + qua r = x.real / length2(x.real); + + qua const rr(r.w * x.real.w, r.x * x.real.x, r.y * x.real.y, r.z * x.real.z); + r *= static_cast(2); + + T const xy = r.x * x.real.y; + T const xz = r.x * x.real.z; + T const yz = r.y * x.real.z; + T const wx = r.w * x.real.x; + T const wy = r.w * x.real.y; + T const wz = r.w * x.real.z; + + vec<4, T, Q> const a( + rr.w + rr.x - rr.y - rr.z, + xy - wz, + xz + wy, + -(x.dual.w * r.x - x.dual.x * r.w + x.dual.y * r.z - x.dual.z * r.y)); + + vec<4, T, Q> const b( + xy + wz, + rr.w + rr.y - rr.x - rr.z, + yz - wx, + -(x.dual.w * r.y - x.dual.x * r.z - x.dual.y * r.w + x.dual.z * r.x)); + + vec<4, T, Q> const c( + xz - wy, + yz + wx, + rr.w + rr.z - rr.x - rr.y, + -(x.dual.w * r.z + x.dual.x * r.y - x.dual.y * r.x - x.dual.z * r.w)); + + return mat<3, 4, T, Q>(a, b, c); + } + + template + GLM_FUNC_QUALIFIER tdualquat dualquat_cast(mat<2, 4, T, Q> const& x) + { + return tdualquat( + qua( x[0].w, x[0].x, x[0].y, x[0].z ), + qua( x[1].w, x[1].x, x[1].y, x[1].z )); + } + + template + GLM_FUNC_QUALIFIER tdualquat dualquat_cast(mat<3, 4, T, Q> const& x) + { + qua real; + + T const trace = x[0].x + x[1].y + x[2].z; + if(trace > static_cast(0)) + { + T const r = sqrt(T(1) + trace); + T const invr = static_cast(0.5) / r; + real.w = static_cast(0.5) * r; + real.x = (x[2].y - x[1].z) * invr; + real.y = (x[0].z - x[2].x) * invr; + real.z = (x[1].x - x[0].y) * invr; + } + else if(x[0].x > x[1].y && x[0].x > x[2].z) + { + T const r = sqrt(T(1) + x[0].x - x[1].y - x[2].z); + T const invr = static_cast(0.5) / r; + real.x = static_cast(0.5)*r; + real.y = (x[1].x + x[0].y) * invr; + real.z = (x[0].z + x[2].x) * invr; + real.w = (x[2].y - x[1].z) * invr; + } + else if(x[1].y > x[2].z) + { + T const r = sqrt(T(1) + x[1].y - x[0].x - x[2].z); + T const invr = static_cast(0.5) / r; + real.x = (x[1].x + x[0].y) * invr; + real.y = static_cast(0.5) * r; + real.z = (x[2].y + x[1].z) * invr; + real.w = (x[0].z - x[2].x) * invr; + } + else + { + T const r = sqrt(T(1) + x[2].z - x[0].x - x[1].y); + T const invr = static_cast(0.5) / r; + real.x = (x[0].z + x[2].x) * invr; + real.y = (x[2].y + x[1].z) * invr; + real.z = static_cast(0.5) * r; + real.w = (x[1].x - x[0].y) * invr; + } + + qua dual; + dual.x = static_cast(0.5) * ( x[0].w * real.w + x[1].w * real.z - x[2].w * real.y); + dual.y = static_cast(0.5) * (-x[0].w * real.z + x[1].w * real.w + x[2].w * real.x); + dual.z = static_cast(0.5) * ( x[0].w * real.y - x[1].w * real.x + x[2].w * real.w); + dual.w = -static_cast(0.5) * ( x[0].w * real.x + x[1].w * real.y + x[2].w * real.z); + return tdualquat(real, dual); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/easing.hpp b/NothinFancy/dep/include/glm/gtx/easing.hpp new file mode 100644 index 0000000..57f3d61 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/easing.hpp @@ -0,0 +1,219 @@ +/// @ref gtx_easing +/// @file glm/gtx/easing.hpp +/// @author Robert Chisholm +/// +/// @see core (dependence) +/// +/// @defgroup gtx_easing GLM_GTX_easing +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Easing functions for animations and transitons +/// All functions take a parameter x in the range [0.0,1.0] +/// +/// Based on the AHEasing project of Warren Moore (https://github.com/warrenm/AHEasing) + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/constants.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_easing is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_easing extension included") +# endif +#endif + +namespace glm{ + /// @addtogroup gtx_easing + /// @{ + + /// Modelled after the line y = x + /// @see gtx_easing + template + GLM_FUNC_DECL genType linearInterpolation(genType const & a); + + /// Modelled after the parabola y = x^2 + /// @see gtx_easing + template + GLM_FUNC_DECL genType quadraticEaseIn(genType const & a); + + /// Modelled after the parabola y = -x^2 + 2x + /// @see gtx_easing + template + GLM_FUNC_DECL genType quadraticEaseOut(genType const & a); + + /// Modelled after the piecewise quadratic + /// y = (1/2)((2x)^2) ; [0, 0.5) + /// y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType quadraticEaseInOut(genType const & a); + + /// Modelled after the cubic y = x^3 + template + GLM_FUNC_DECL genType cubicEaseIn(genType const & a); + + /// Modelled after the cubic y = (x - 1)^3 + 1 + /// @see gtx_easing + template + GLM_FUNC_DECL genType cubicEaseOut(genType const & a); + + /// Modelled after the piecewise cubic + /// y = (1/2)((2x)^3) ; [0, 0.5) + /// y = (1/2)((2x-2)^3 + 2) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType cubicEaseInOut(genType const & a); + + /// Modelled after the quartic x^4 + /// @see gtx_easing + template + GLM_FUNC_DECL genType quarticEaseIn(genType const & a); + + /// Modelled after the quartic y = 1 - (x - 1)^4 + /// @see gtx_easing + template + GLM_FUNC_DECL genType quarticEaseOut(genType const & a); + + /// Modelled after the piecewise quartic + /// y = (1/2)((2x)^4) ; [0, 0.5) + /// y = -(1/2)((2x-2)^4 - 2) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType quarticEaseInOut(genType const & a); + + /// Modelled after the quintic y = x^5 + /// @see gtx_easing + template + GLM_FUNC_DECL genType quinticEaseIn(genType const & a); + + /// Modelled after the quintic y = (x - 1)^5 + 1 + /// @see gtx_easing + template + GLM_FUNC_DECL genType quinticEaseOut(genType const & a); + + /// Modelled after the piecewise quintic + /// y = (1/2)((2x)^5) ; [0, 0.5) + /// y = (1/2)((2x-2)^5 + 2) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType quinticEaseInOut(genType const & a); + + /// Modelled after quarter-cycle of sine wave + /// @see gtx_easing + template + GLM_FUNC_DECL genType sineEaseIn(genType const & a); + + /// Modelled after quarter-cycle of sine wave (different phase) + /// @see gtx_easing + template + GLM_FUNC_DECL genType sineEaseOut(genType const & a); + + /// Modelled after half sine wave + /// @see gtx_easing + template + GLM_FUNC_DECL genType sineEaseInOut(genType const & a); + + /// Modelled after shifted quadrant IV of unit circle + /// @see gtx_easing + template + GLM_FUNC_DECL genType circularEaseIn(genType const & a); + + /// Modelled after shifted quadrant II of unit circle + /// @see gtx_easing + template + GLM_FUNC_DECL genType circularEaseOut(genType const & a); + + /// Modelled after the piecewise circular function + /// y = (1/2)(1 - sqrt(1 - 4x^2)) ; [0, 0.5) + /// y = (1/2)(sqrt(-(2x - 3)*(2x - 1)) + 1) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType circularEaseInOut(genType const & a); + + /// Modelled after the exponential function y = 2^(10(x - 1)) + /// @see gtx_easing + template + GLM_FUNC_DECL genType exponentialEaseIn(genType const & a); + + /// Modelled after the exponential function y = -2^(-10x) + 1 + /// @see gtx_easing + template + GLM_FUNC_DECL genType exponentialEaseOut(genType const & a); + + /// Modelled after the piecewise exponential + /// y = (1/2)2^(10(2x - 1)) ; [0,0.5) + /// y = -(1/2)*2^(-10(2x - 1))) + 1 ; [0.5,1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType exponentialEaseInOut(genType const & a); + + /// Modelled after the damped sine wave y = sin(13pi/2*x)*pow(2, 10 * (x - 1)) + /// @see gtx_easing + template + GLM_FUNC_DECL genType elasticEaseIn(genType const & a); + + /// Modelled after the damped sine wave y = sin(-13pi/2*(x + 1))*pow(2, -10x) + 1 + /// @see gtx_easing + template + GLM_FUNC_DECL genType elasticEaseOut(genType const & a); + + /// Modelled after the piecewise exponentially-damped sine wave: + /// y = (1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)) ; [0,0.5) + /// y = (1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType elasticEaseInOut(genType const & a); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseIn(genType const& a); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseOut(genType const& a); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseInOut(genType const& a); + + /// @param a parameter + /// @param o Optional overshoot modifier + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseIn(genType const& a, genType const& o); + + /// @param a parameter + /// @param o Optional overshoot modifier + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseOut(genType const& a, genType const& o); + + /// @param a parameter + /// @param o Optional overshoot modifier + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseInOut(genType const& a, genType const& o); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType bounceEaseIn(genType const& a); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType bounceEaseOut(genType const& a); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType bounceEaseInOut(genType const& a); + + /// @} +}//namespace glm + +#include "easing.inl" diff --git a/NothinFancy/dep/include/glm/gtx/easing.inl b/NothinFancy/dep/include/glm/gtx/easing.inl new file mode 100644 index 0000000..4b7d05b --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/easing.inl @@ -0,0 +1,436 @@ +/// @ref gtx_easing + +#include + +namespace glm{ + + template + GLM_FUNC_QUALIFIER genType linearInterpolation(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return a; + } + + template + GLM_FUNC_QUALIFIER genType quadraticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return a * a; + } + + template + GLM_FUNC_QUALIFIER genType quadraticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return -(a * (a - static_cast(2))); + } + + template + GLM_FUNC_QUALIFIER genType quadraticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + { + return static_cast(2) * a * a; + } + else + { + return (-static_cast(2) * a * a) + (4 * a) - one(); + } + } + + template + GLM_FUNC_QUALIFIER genType cubicEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return a * a * a; + } + + template + GLM_FUNC_QUALIFIER genType cubicEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType const f = a - one(); + return f * f * f + one(); + } + + template + GLM_FUNC_QUALIFIER genType cubicEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if (a < static_cast(0.5)) + { + return static_cast(4) * a * a * a; + } + else + { + genType const f = ((static_cast(2) * a) - static_cast(2)); + return static_cast(0.5) * f * f * f + one(); + } + } + + template + GLM_FUNC_QUALIFIER genType quarticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return a * a * a * a; + } + + template + GLM_FUNC_QUALIFIER genType quarticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType const f = (a - one()); + return f * f * f * (one() - a) + one(); + } + + template + GLM_FUNC_QUALIFIER genType quarticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + { + return static_cast(8) * a * a * a * a; + } + else + { + genType const f = (a - one()); + return -static_cast(8) * f * f * f * f + one(); + } + } + + template + GLM_FUNC_QUALIFIER genType quinticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return a * a * a * a * a; + } + + template + GLM_FUNC_QUALIFIER genType quinticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType const f = (a - one()); + return f * f * f * f * f + one(); + } + + template + GLM_FUNC_QUALIFIER genType quinticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + { + return static_cast(16) * a * a * a * a * a; + } + else + { + genType const f = ((static_cast(2) * a) - static_cast(2)); + return static_cast(0.5) * f * f * f * f * f + one(); + } + } + + template + GLM_FUNC_QUALIFIER genType sineEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return sin((a - one()) * half_pi()) + one(); + } + + template + GLM_FUNC_QUALIFIER genType sineEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return sin(a * half_pi()); + } + + template + GLM_FUNC_QUALIFIER genType sineEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return static_cast(0.5) * (one() - cos(a * pi())); + } + + template + GLM_FUNC_QUALIFIER genType circularEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return one() - sqrt(one() - (a * a)); + } + + template + GLM_FUNC_QUALIFIER genType circularEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return sqrt((static_cast(2) - a) * a); + } + + template + GLM_FUNC_QUALIFIER genType circularEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + { + return static_cast(0.5) * (one() - std::sqrt(one() - static_cast(4) * (a * a))); + } + else + { + return static_cast(0.5) * (std::sqrt(-((static_cast(2) * a) - static_cast(3)) * ((static_cast(2) * a) - one())) + one()); + } + } + + template + GLM_FUNC_QUALIFIER genType exponentialEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a <= zero()) + return a; + else + { + genType const Complementary = a - one(); + genType const Two = static_cast(2); + + return glm::pow(Two, Complementary * static_cast(10)); + } + } + + template + GLM_FUNC_QUALIFIER genType exponentialEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a >= one()) + return a; + else + { + return one() - glm::pow(static_cast(2), -static_cast(10) * a); + } + } + + template + GLM_FUNC_QUALIFIER genType exponentialEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + return static_cast(0.5) * glm::pow(static_cast(2), (static_cast(20) * a) - static_cast(10)); + else + return -static_cast(0.5) * glm::pow(static_cast(2), (-static_cast(20) * a) + static_cast(10)) + one(); + } + + template + GLM_FUNC_QUALIFIER genType elasticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return std::sin(static_cast(13) * half_pi() * a) * glm::pow(static_cast(2), static_cast(10) * (a - one())); + } + + template + GLM_FUNC_QUALIFIER genType elasticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return std::sin(-static_cast(13) * half_pi() * (a + one())) * glm::pow(static_cast(2), -static_cast(10) * a) + one(); + } + + template + GLM_FUNC_QUALIFIER genType elasticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + return static_cast(0.5) * std::sin(static_cast(13) * half_pi() * (static_cast(2) * a)) * glm::pow(static_cast(2), static_cast(10) * ((static_cast(2) * a) - one())); + else + return static_cast(0.5) * (std::sin(-static_cast(13) * half_pi() * ((static_cast(2) * a - one()) + one())) * glm::pow(static_cast(2), -static_cast(10) * (static_cast(2) * a - one())) + static_cast(2)); + } + + template + GLM_FUNC_QUALIFIER genType backEaseIn(genType const& a, genType const& o) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType z = ((o + one()) * a) - o; + return (a * a * z); + } + + template + GLM_FUNC_QUALIFIER genType backEaseOut(genType const& a, genType const& o) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType n = a - one(); + genType z = ((o + one()) * n) + o; + return (n * n * z) + one(); + } + + template + GLM_FUNC_QUALIFIER genType backEaseInOut(genType const& a, genType const& o) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType s = o * static_cast(1.525); + genType x = static_cast(0.5); + genType n = a / static_cast(0.5); + + if (n < static_cast(1)) + { + genType z = ((s + static_cast(1)) * n) - s; + genType m = n * n * z; + return x * m; + } + else + { + n -= static_cast(2); + genType z = ((s + static_cast(1)) * n) + s; + genType m = (n*n*z) + static_cast(2); + return x * m; + } + } + + template + GLM_FUNC_QUALIFIER genType backEaseIn(genType const& a) + { + return backEaseIn(a, static_cast(1.70158)); + } + + template + GLM_FUNC_QUALIFIER genType backEaseOut(genType const& a) + { + return backEaseOut(a, static_cast(1.70158)); + } + + template + GLM_FUNC_QUALIFIER genType backEaseInOut(genType const& a) + { + return backEaseInOut(a, static_cast(1.70158)); + } + + template + GLM_FUNC_QUALIFIER genType bounceEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(4.0 / 11.0)) + { + return (static_cast(121) * a * a) / static_cast(16); + } + else if(a < static_cast(8.0 / 11.0)) + { + return (static_cast(363.0 / 40.0) * a * a) - (static_cast(99.0 / 10.0) * a) + static_cast(17.0 / 5.0); + } + else if(a < static_cast(9.0 / 10.0)) + { + return (static_cast(4356.0 / 361.0) * a * a) - (static_cast(35442.0 / 1805.0) * a) + static_cast(16061.0 / 1805.0); + } + else + { + return (static_cast(54.0 / 5.0) * a * a) - (static_cast(513.0 / 25.0) * a) + static_cast(268.0 / 25.0); + } + } + + template + GLM_FUNC_QUALIFIER genType bounceEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return one() - bounceEaseOut(one() - a); + } + + template + GLM_FUNC_QUALIFIER genType bounceEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + { + return static_cast(0.5) * (one() - bounceEaseOut(a * static_cast(2))); + } + else + { + return static_cast(0.5) * bounceEaseOut(a * static_cast(2) - one()) + static_cast(0.5); + } + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/euler_angles.hpp b/NothinFancy/dep/include/glm/gtx/euler_angles.hpp new file mode 100644 index 0000000..2723697 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/euler_angles.hpp @@ -0,0 +1,335 @@ +/// @ref gtx_euler_angles +/// @file glm/gtx/euler_angles.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_euler_angles GLM_GTX_euler_angles +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Build matrices from Euler angles. +/// +/// Extraction of Euler angles from rotation matrix. +/// Based on the original paper 2014 Mike Day - Extracting Euler Angles from a Rotation Matrix. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_euler_angles is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_euler_angles extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_euler_angles + /// @{ + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleX( + T const& angleX); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleY( + T const& angleY); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZ( + T const& angleZ); + + /// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about X-axis. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleX( + T const & angleX, T const & angularVelocityX); + + /// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about Y-axis. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleY( + T const & angleY, T const & angularVelocityY); + + /// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about Z-axis. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleZ( + T const & angleZ, T const & angularVelocityZ); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXY( + T const& angleX, + T const& angleY); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYX( + T const& angleY, + T const& angleX); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZ( + T const& angleX, + T const& angleZ); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZX( + T const& angle, + T const& angleX); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZ( + T const& angleY, + T const& angleZ); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZY( + T const& angleZ, + T const& angleY); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXYZ( + T const& t1, + T const& t2, + T const& t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYXZ( + T const& yaw, + T const& pitch, + T const& roll); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXYX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYXY( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZY( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZYZ( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZXZ( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZY( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZYX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZXY( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> yawPitchRoll( + T const& yaw, + T const& pitch, + T const& roll); + + /// Creates a 2D 2 * 2 rotation matrix from an euler angle. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<2, 2, T, defaultp> orientate2(T const& angle); + + /// Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<3, 3, T, defaultp> orientate3(T const& angle); + + /// Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<3, 3, T, Q> orientate3(vec<3, T, Q> const& angles); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, Q> orientate4(vec<3, T, Q> const& angles); + + /// Extracts the (X * Y * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleXYZ(mat<4, 4, T, defaultp> const& M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * X * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleYXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (X * Z * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleXZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (X * Y * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleXYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * X * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleYXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * Z * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleYZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * Y * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleZYZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * X * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleZXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (X * Z * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleXZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * Z * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleYZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * Y * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleZYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * X * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleZXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// @} +}//namespace glm + +#include "euler_angles.inl" diff --git a/NothinFancy/dep/include/glm/gtx/euler_angles.inl b/NothinFancy/dep/include/glm/gtx/euler_angles.inl new file mode 100644 index 0000000..68c5012 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/euler_angles.inl @@ -0,0 +1,899 @@ +/// @ref gtx_euler_angles + +#include "compatibility.hpp" // glm::atan2 + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleX + ( + T const& angleX + ) + { + T cosX = glm::cos(angleX); + T sinX = glm::sin(angleX); + + return mat<4, 4, T, defaultp>( + T(1), T(0), T(0), T(0), + T(0), cosX, sinX, T(0), + T(0),-sinX, cosX, T(0), + T(0), T(0), T(0), T(1)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleY + ( + T const& angleY + ) + { + T cosY = glm::cos(angleY); + T sinY = glm::sin(angleY); + + return mat<4, 4, T, defaultp>( + cosY, T(0), -sinY, T(0), + T(0), T(1), T(0), T(0), + sinY, T(0), cosY, T(0), + T(0), T(0), T(0), T(1)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZ + ( + T const& angleZ + ) + { + T cosZ = glm::cos(angleZ); + T sinZ = glm::sin(angleZ); + + return mat<4, 4, T, defaultp>( + cosZ, sinZ, T(0), T(0), + -sinZ, cosZ, T(0), T(0), + T(0), T(0), T(1), T(0), + T(0), T(0), T(0), T(1)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleX + ( + T const & angleX, + T const & angularVelocityX + ) + { + T cosX = glm::cos(angleX) * angularVelocityX; + T sinX = glm::sin(angleX) * angularVelocityX; + + return mat<4, 4, T, defaultp>( + T(0), T(0), T(0), T(0), + T(0),-sinX, cosX, T(0), + T(0),-cosX,-sinX, T(0), + T(0), T(0), T(0), T(0)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleY + ( + T const & angleY, + T const & angularVelocityY + ) + { + T cosY = glm::cos(angleY) * angularVelocityY; + T sinY = glm::sin(angleY) * angularVelocityY; + + return mat<4, 4, T, defaultp>( + -sinY, T(0), -cosY, T(0), + T(0), T(0), T(0), T(0), + cosY, T(0), -sinY, T(0), + T(0), T(0), T(0), T(0)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleZ + ( + T const & angleZ, + T const & angularVelocityZ + ) + { + T cosZ = glm::cos(angleZ) * angularVelocityZ; + T sinZ = glm::sin(angleZ) * angularVelocityZ; + + return mat<4, 4, T, defaultp>( + -sinZ, cosZ, T(0), T(0), + -cosZ, -sinZ, T(0), T(0), + T(0), T(0), T(0), T(0), + T(0), T(0), T(0), T(0)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXY + ( + T const& angleX, + T const& angleY + ) + { + T cosX = glm::cos(angleX); + T sinX = glm::sin(angleX); + T cosY = glm::cos(angleY); + T sinY = glm::sin(angleY); + + return mat<4, 4, T, defaultp>( + cosY, -sinX * -sinY, cosX * -sinY, T(0), + T(0), cosX, sinX, T(0), + sinY, -sinX * cosY, cosX * cosY, T(0), + T(0), T(0), T(0), T(1)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYX + ( + T const& angleY, + T const& angleX + ) + { + T cosX = glm::cos(angleX); + T sinX = glm::sin(angleX); + T cosY = glm::cos(angleY); + T sinY = glm::sin(angleY); + + return mat<4, 4, T, defaultp>( + cosY, 0, -sinY, T(0), + sinY * sinX, cosX, cosY * sinX, T(0), + sinY * cosX, -sinX, cosY * cosX, T(0), + T(0), T(0), T(0), T(1)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZ + ( + T const& angleX, + T const& angleZ + ) + { + return eulerAngleX(angleX) * eulerAngleZ(angleZ); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZX + ( + T const& angleZ, + T const& angleX + ) + { + return eulerAngleZ(angleZ) * eulerAngleX(angleX); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZ + ( + T const& angleY, + T const& angleZ + ) + { + return eulerAngleY(angleY) * eulerAngleZ(angleZ); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZY + ( + T const& angleZ, + T const& angleY + ) + { + return eulerAngleZ(angleZ) * eulerAngleY(angleY); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXYZ + ( + T const& t1, + T const& t2, + T const& t3 + ) + { + T c1 = glm::cos(-t1); + T c2 = glm::cos(-t2); + T c3 = glm::cos(-t3); + T s1 = glm::sin(-t1); + T s2 = glm::sin(-t2); + T s3 = glm::sin(-t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c2 * c3; + Result[0][1] =-c1 * s3 + s1 * s2 * c3; + Result[0][2] = s1 * s3 + c1 * s2 * c3; + Result[0][3] = static_cast(0); + Result[1][0] = c2 * s3; + Result[1][1] = c1 * c3 + s1 * s2 * s3; + Result[1][2] =-s1 * c3 + c1 * s2 * s3; + Result[1][3] = static_cast(0); + Result[2][0] =-s2; + Result[2][1] = s1 * c2; + Result[2][2] = c1 * c2; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYXZ + ( + T const& yaw, + T const& pitch, + T const& roll + ) + { + T tmp_ch = glm::cos(yaw); + T tmp_sh = glm::sin(yaw); + T tmp_cp = glm::cos(pitch); + T tmp_sp = glm::sin(pitch); + T tmp_cb = glm::cos(roll); + T tmp_sb = glm::sin(roll); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; + Result[0][1] = tmp_sb * tmp_cp; + Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; + Result[0][3] = static_cast(0); + Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb; + Result[1][1] = tmp_cb * tmp_cp; + Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb; + Result[1][3] = static_cast(0); + Result[2][0] = tmp_sh * tmp_cp; + Result[2][1] = -tmp_sp; + Result[2][2] = tmp_ch * tmp_cp; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c2; + Result[0][1] = c1 * s2; + Result[0][2] = s1 * s2; + Result[0][3] = static_cast(0); + Result[1][0] =-c3 * s2; + Result[1][1] = c1 * c2 * c3 - s1 * s3; + Result[1][2] = c1 * s3 + c2 * c3 * s1; + Result[1][3] = static_cast(0); + Result[2][0] = s2 * s3; + Result[2][1] =-c3 * s1 - c1 * c2 * s3; + Result[2][2] = c1 * c3 - c2 * s1 * s3; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXYX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c2; + Result[0][1] = s1 * s2; + Result[0][2] =-c1 * s2; + Result[0][3] = static_cast(0); + Result[1][0] = s2 * s3; + Result[1][1] = c1 * c3 - c2 * s1 * s3; + Result[1][2] = c3 * s1 + c1 * c2 * s3; + Result[1][3] = static_cast(0); + Result[2][0] = c3 * s2; + Result[2][1] =-c1 * s3 - c2 * c3 * s1; + Result[2][2] = c1 * c2 * c3 - s1 * s3; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYXY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c3 - c2 * s1 * s3; + Result[0][1] = s2* s3; + Result[0][2] =-c3 * s1 - c1 * c2 * s3; + Result[0][3] = static_cast(0); + Result[1][0] = s1 * s2; + Result[1][1] = c2; + Result[1][2] = c1 * s2; + Result[1][3] = static_cast(0); + Result[2][0] = c1 * s3 + c2 * c3 * s1; + Result[2][1] =-c3 * s2; + Result[2][2] = c1 * c2 * c3 - s1 * s3; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2 * c3 - s1 * s3; + Result[0][1] = c3 * s2; + Result[0][2] =-c1 * s3 - c2 * c3 * s1; + Result[0][3] = static_cast(0); + Result[1][0] =-c1 * s2; + Result[1][1] = c2; + Result[1][2] = s1 * s2; + Result[1][3] = static_cast(0); + Result[2][0] = c3 * s1 + c1 * c2 * s3; + Result[2][1] = s2 * s3; + Result[2][2] = c1 * c3 - c2 * s1 * s3; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZYZ + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2 * c3 - s1 * s3; + Result[0][1] = c1 * s3 + c2 * c3 * s1; + Result[0][2] =-c3 * s2; + Result[0][3] = static_cast(0); + Result[1][0] =-c3 * s1 - c1 * c2 * s3; + Result[1][1] = c1 * c3 - c2 * s1 * s3; + Result[1][2] = s2 * s3; + Result[1][3] = static_cast(0); + Result[2][0] = c1 * s2; + Result[2][1] = s1 * s2; + Result[2][2] = c2; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZXZ + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c3 - c2 * s1 * s3; + Result[0][1] = c3 * s1 + c1 * c2 * s3; + Result[0][2] = s2 *s3; + Result[0][3] = static_cast(0); + Result[1][0] =-c1 * s3 - c2 * c3 * s1; + Result[1][1] = c1 * c2 * c3 - s1 * s3; + Result[1][2] = c3 * s2; + Result[1][3] = static_cast(0); + Result[2][0] = s1 * s2; + Result[2][1] =-c1 * s2; + Result[2][2] = c2; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c2 * c3; + Result[0][1] = s1 * s3 + c1 * c3 * s2; + Result[0][2] = c3 * s1 * s2 - c1 * s3; + Result[0][3] = static_cast(0); + Result[1][0] =-s2; + Result[1][1] = c1 * c2; + Result[1][2] = c2 * s1; + Result[1][3] = static_cast(0); + Result[2][0] = c2 * s3; + Result[2][1] = c1 * s2 * s3 - c3 * s1; + Result[2][2] = c1 * c3 + s1 * s2 *s3; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2; + Result[0][1] = s2; + Result[0][2] =-c2 * s1; + Result[0][3] = static_cast(0); + Result[1][0] = s1 * s3 - c1 * c3 * s2; + Result[1][1] = c2 * c3; + Result[1][2] = c1 * s3 + c3 * s1 * s2; + Result[1][3] = static_cast(0); + Result[2][0] = c3 * s1 + c1 * s2 * s3; + Result[2][1] =-c2 * s3; + Result[2][2] = c1 * c3 - s1 * s2 * s3; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZYX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2; + Result[0][1] = c2 * s1; + Result[0][2] =-s2; + Result[0][3] = static_cast(0); + Result[1][0] = c1 * s2 * s3 - c3 * s1; + Result[1][1] = c1 * c3 + s1 * s2 * s3; + Result[1][2] = c2 * s3; + Result[1][3] = static_cast(0); + Result[2][0] = s1 * s3 + c1 * c3 * s2; + Result[2][1] = c3 * s1 * s2 - c1 * s3; + Result[2][2] = c2 * c3; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZXY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c3 - s1 * s2 * s3; + Result[0][1] = c3 * s1 + c1 * s2 * s3; + Result[0][2] =-c2 * s3; + Result[0][3] = static_cast(0); + Result[1][0] =-c2 * s1; + Result[1][1] = c1 * c2; + Result[1][2] = s2; + Result[1][3] = static_cast(0); + Result[2][0] = c1 * s3 + c3 * s1 * s2; + Result[2][1] = s1 * s3 - c1 * c3 * s2; + Result[2][2] = c2 * c3; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> yawPitchRoll + ( + T const& yaw, + T const& pitch, + T const& roll + ) + { + T tmp_ch = glm::cos(yaw); + T tmp_sh = glm::sin(yaw); + T tmp_cp = glm::cos(pitch); + T tmp_sp = glm::sin(pitch); + T tmp_cb = glm::cos(roll); + T tmp_sb = glm::sin(roll); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; + Result[0][1] = tmp_sb * tmp_cp; + Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; + Result[0][3] = static_cast(0); + Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb; + Result[1][1] = tmp_cb * tmp_cp; + Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb; + Result[1][3] = static_cast(0); + Result[2][0] = tmp_sh * tmp_cp; + Result[2][1] = -tmp_sp; + Result[2][2] = tmp_ch * tmp_cp; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> orientate2 + ( + T const& angle + ) + { + T c = glm::cos(angle); + T s = glm::sin(angle); + + mat<2, 2, T, defaultp> Result; + Result[0][0] = c; + Result[0][1] = s; + Result[1][0] = -s; + Result[1][1] = c; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> orientate3 + ( + T const& angle + ) + { + T c = glm::cos(angle); + T s = glm::sin(angle); + + mat<3, 3, T, defaultp> Result; + Result[0][0] = c; + Result[0][1] = s; + Result[0][2] = 0.0f; + Result[1][0] = -s; + Result[1][1] = c; + Result[1][2] = 0.0f; + Result[2][0] = 0.0f; + Result[2][1] = 0.0f; + Result[2][2] = 1.0f; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> orientate3 + ( + vec<3, T, Q> const& angles + ) + { + return mat<3, 3, T, Q>(yawPitchRoll(angles.z, angles.x, angles.y)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientate4 + ( + vec<3, T, Q> const& angles + ) + { + return yawPitchRoll(angles.z, angles.x, angles.y); + } + + template + GLM_FUNC_DECL void extractEulerAngleXYZ(mat<4, 4, T, defaultp> const& M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[2][1], M[2][2]); + T C2 = glm::sqrt(M[0][0]*M[0][0] + M[1][0]*M[1][0]); + T T2 = glm::atan2(-M[2][0], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(S1*M[0][2] - C1*M[0][1], C1*M[1][1] - S1*M[1][2 ]); + t1 = -T1; + t2 = -T2; + t3 = -T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleYXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[2][0], M[2][2]); + T C2 = glm::sqrt(M[0][1]*M[0][1] + M[1][1]*M[1][1]); + T T2 = glm::atan2(-M[2][1], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(S1*M[1][2] - C1*M[1][0], C1*M[0][0] - S1*M[0][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleXZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[0][2], M[0][1]); + T S2 = glm::sqrt(M[1][0]*M[1][0] + M[2][0]*M[2][0]); + T T2 = glm::atan2(S2, M[0][0]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(C1*M[1][2] - S1*M[1][1], C1*M[2][2] - S1*M[2][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleXYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[0][1], -M[0][2]); + T S2 = glm::sqrt(M[1][0]*M[1][0] + M[2][0]*M[2][0]); + T T2 = glm::atan2(S2, M[0][0]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(-C1*M[2][1] - S1*M[2][2], C1*M[1][1] + S1*M[1][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleYXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[1][0], M[1][2]); + T S2 = glm::sqrt(M[0][1]*M[0][1] + M[2][1]*M[2][1]); + T T2 = glm::atan2(S2, M[1][1]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(C1*M[2][0] - S1*M[2][2], C1*M[0][0] - S1*M[0][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleYZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[1][2], -M[1][0]); + T S2 = glm::sqrt(M[0][1]*M[0][1] + M[2][1]*M[2][1]); + T T2 = glm::atan2(S2, M[1][1]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(-S1*M[0][0] - C1*M[0][2], S1*M[2][0] + C1*M[2][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleZYZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[2][1], M[2][0]); + T S2 = glm::sqrt(M[0][2]*M[0][2] + M[1][2]*M[1][2]); + T T2 = glm::atan2(S2, M[2][2]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(C1*M[0][1] - S1*M[0][0], C1*M[1][1] - S1*M[1][0]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleZXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[2][0], -M[2][1]); + T S2 = glm::sqrt(M[0][2]*M[0][2] + M[1][2]*M[1][2]); + T T2 = glm::atan2(S2, M[2][2]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(-C1*M[1][0] - S1*M[1][1], C1*M[0][0] + S1*M[0][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleXZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[1][2], M[1][1]); + T C2 = glm::sqrt(M[0][0]*M[0][0] + M[2][0]*M[2][0]); + T T2 = glm::atan2(-M[1][0], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(S1*M[0][1] - C1*M[0][2], C1*M[2][2] - S1*M[2][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleYZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(-M[0][2], M[0][0]); + T C2 = glm::sqrt(M[1][1]*M[1][1] + M[2][1]*M[2][1]); + T T2 = glm::atan2(M[0][1], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(S1*M[1][0] + C1*M[1][2], S1*M[2][0] + C1*M[2][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleZYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[0][1], M[0][0]); + T C2 = glm::sqrt(M[1][2]*M[1][2] + M[2][2]*M[2][2]); + T T2 = glm::atan2(-M[0][2], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(S1*M[2][0] - C1*M[2][1], C1*M[1][1] - S1*M[1][0]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleZXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(-M[1][0], M[1][1]); + T C2 = glm::sqrt(M[0][2]*M[0][2] + M[2][2]*M[2][2]); + T T2 = glm::atan2(M[1][2], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(C1*M[2][0] + S1*M[2][1], C1*M[0][0] + S1*M[0][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/extend.hpp b/NothinFancy/dep/include/glm/gtx/extend.hpp new file mode 100644 index 0000000..28b7c5c --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/extend.hpp @@ -0,0 +1,42 @@ +/// @ref gtx_extend +/// @file glm/gtx/extend.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_extend GLM_GTX_extend +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Extend a position from a source to a position at a defined length. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_extend extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_extend + /// @{ + + /// Extends of Length the Origin position using the (Source - Origin) direction. + /// @see gtx_extend + template + GLM_FUNC_DECL genType extend( + genType const& Origin, + genType const& Source, + typename genType::value_type const Length); + + /// @} +}//namespace glm + +#include "extend.inl" diff --git a/NothinFancy/dep/include/glm/gtx/extend.inl b/NothinFancy/dep/include/glm/gtx/extend.inl new file mode 100644 index 0000000..32128eb --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/extend.inl @@ -0,0 +1,48 @@ +/// @ref gtx_extend + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType extend + ( + genType const& Origin, + genType const& Source, + genType const& Distance + ) + { + return Origin + (Source - Origin) * Distance; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> extend + ( + vec<2, T, Q> const& Origin, + vec<2, T, Q> const& Source, + T const& Distance + ) + { + return Origin + (Source - Origin) * Distance; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> extend + ( + vec<3, T, Q> const& Origin, + vec<3, T, Q> const& Source, + T const& Distance + ) + { + return Origin + (Source - Origin) * Distance; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> extend + ( + vec<4, T, Q> const& Origin, + vec<4, T, Q> const& Source, + T const& Distance + ) + { + return Origin + (Source - Origin) * Distance; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/extended_min_max.hpp b/NothinFancy/dep/include/glm/gtx/extended_min_max.hpp new file mode 100644 index 0000000..025eda2 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/extended_min_max.hpp @@ -0,0 +1,137 @@ +/// @ref gtx_extended_min_max +/// @file glm/gtx/extended_min_max.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_extended_min_max GLM_GTX_extented_min_max +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Min and max functions for 3 to 4 parameters. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../ext/vector_common.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_extented_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_extented_min_max extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_extended_min_max + /// @{ + + /// Return the minimum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template + GLM_FUNC_DECL T min( + T const& x, + T const& y, + T const& z); + + /// Return the minimum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C min( + C const& x, + typename C::T const& y, + typename C::T const& z); + + /// Return the minimum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C min( + C const& x, + C const& y, + C const& z); + + /// Return the minimum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template + GLM_FUNC_DECL T min( + T const& x, + T const& y, + T const& z, + T const& w); + + /// Return the minimum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C min( + C const& x, + typename C::T const& y, + typename C::T const& z, + typename C::T const& w); + + /// Return the minimum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C min( + C const& x, + C const& y, + C const& z, + C const& w); + + /// Return the maximum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template + GLM_FUNC_DECL T max( + T const& x, + T const& y, + T const& z); + + /// Return the maximum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C max( + C const& x, + typename C::T const& y, + typename C::T const& z); + + /// Return the maximum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C max( + C const& x, + C const& y, + C const& z); + + /// Return the maximum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template + GLM_FUNC_DECL T max( + T const& x, + T const& y, + T const& z, + T const& w); + + /// Return the maximum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C max( + C const& x, + typename C::T const& y, + typename C::T const& z, + typename C::T const& w); + + /// Return the maximum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C max( + C const& x, + C const& y, + C const& z, + C const& w); + + /// @} +}//namespace glm + +#include "extended_min_max.inl" diff --git a/NothinFancy/dep/include/glm/gtx/extended_min_max.inl b/NothinFancy/dep/include/glm/gtx/extended_min_max.inl new file mode 100644 index 0000000..de5998f --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/extended_min_max.inl @@ -0,0 +1,138 @@ +/// @ref gtx_extended_min_max + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T min( + T const& x, + T const& y, + T const& z) + { + return glm::min(glm::min(x, y), z); + } + + template class C> + GLM_FUNC_QUALIFIER C min + ( + C const& x, + typename C::T const& y, + typename C::T const& z + ) + { + return glm::min(glm::min(x, y), z); + } + + template class C> + GLM_FUNC_QUALIFIER C min + ( + C const& x, + C const& y, + C const& z + ) + { + return glm::min(glm::min(x, y), z); + } + + template + GLM_FUNC_QUALIFIER T min + ( + T const& x, + T const& y, + T const& z, + T const& w + ) + { + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template class C> + GLM_FUNC_QUALIFIER C min + ( + C const& x, + typename C::T const& y, + typename C::T const& z, + typename C::T const& w + ) + { + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template class C> + GLM_FUNC_QUALIFIER C min + ( + C const& x, + C const& y, + C const& z, + C const& w + ) + { + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template + GLM_FUNC_QUALIFIER T max( + T const& x, + T const& y, + T const& z) + { + return glm::max(glm::max(x, y), z); + } + + template class C> + GLM_FUNC_QUALIFIER C max + ( + C const& x, + typename C::T const& y, + typename C::T const& z + ) + { + return glm::max(glm::max(x, y), z); + } + + template class C> + GLM_FUNC_QUALIFIER C max + ( + C const& x, + C const& y, + C const& z + ) + { + return glm::max(glm::max(x, y), z); + } + + template + GLM_FUNC_QUALIFIER T max + ( + T const& x, + T const& y, + T const& z, + T const& w + ) + { + return glm::max(glm::max(x, y), glm::max(z, w)); + } + + template class C> + GLM_FUNC_QUALIFIER C max + ( + C const& x, + typename C::T const& y, + typename C::T const& z, + typename C::T const& w + ) + { + return glm::max(glm::max(x, y), glm::max(z, w)); + } + + template class C> + GLM_FUNC_QUALIFIER C max + ( + C const& x, + C const& y, + C const& z, + C const& w + ) + { + return glm::max(glm::max(x, y), glm::max(z, w)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/exterior_product.hpp b/NothinFancy/dep/include/glm/gtx/exterior_product.hpp new file mode 100644 index 0000000..5522df7 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/exterior_product.hpp @@ -0,0 +1,45 @@ +/// @ref gtx_exterior_product +/// @file glm/gtx/exterior_product.hpp +/// +/// @see core (dependence) +/// @see gtx_exterior_product (dependence) +/// +/// @defgroup gtx_exterior_product GLM_GTX_exterior_product +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// @brief Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_exterior_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_exterior_product extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_exterior_product + /// @{ + + /// Returns the cross product of x and y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see Exterior product + template + GLM_FUNC_DECL T cross(vec<2, T, Q> const& v, vec<2, T, Q> const& u); + + /// @} +} //namespace glm + +#include "exterior_product.inl" diff --git a/NothinFancy/dep/include/glm/gtx/exterior_product.inl b/NothinFancy/dep/include/glm/gtx/exterior_product.inl new file mode 100644 index 0000000..93661fd --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/exterior_product.inl @@ -0,0 +1,26 @@ +/// @ref gtx_exterior_product + +#include + +namespace glm { +namespace detail +{ + template + struct compute_cross_vec2 + { + GLM_FUNC_QUALIFIER static T call(vec<2, T, Q> const& v, vec<2, T, Q> const& u) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'cross' accepts only floating-point inputs"); + + return v.x * u.y - u.x * v.y; + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER T cross(vec<2, T, Q> const& x, vec<2, T, Q> const& y) + { + return detail::compute_cross_vec2::value>::call(x, y); + } +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/gtx/fast_exponential.hpp b/NothinFancy/dep/include/glm/gtx/fast_exponential.hpp new file mode 100644 index 0000000..6fb7286 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/fast_exponential.hpp @@ -0,0 +1,95 @@ +/// @ref gtx_fast_exponential +/// @file glm/gtx/fast_exponential.hpp +/// +/// @see core (dependence) +/// @see gtx_half_float (dependence) +/// +/// @defgroup gtx_fast_exponential GLM_GTX_fast_exponential +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Fast but less accurate implementations of exponential based functions. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_fast_exponential is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_fast_exponential extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_fast_exponential + /// @{ + + /// Faster than the common pow function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL genType fastPow(genType x, genType y); + + /// Faster than the common pow function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastPow(vec const& x, vec const& y); + + /// Faster than the common pow function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL genTypeT fastPow(genTypeT x, genTypeU y); + + /// Faster than the common pow function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastPow(vec const& x); + + /// Faster than the common exp function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL T fastExp(T x); + + /// Faster than the common exp function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastExp(vec const& x); + + /// Faster than the common log function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL T fastLog(T x); + + /// Faster than the common exp2 function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastLog(vec const& x); + + /// Faster than the common exp2 function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL T fastExp2(T x); + + /// Faster than the common exp2 function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastExp2(vec const& x); + + /// Faster than the common log2 function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL T fastLog2(T x); + + /// Faster than the common log2 function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastLog2(vec const& x); + + /// @} +}//namespace glm + +#include "fast_exponential.inl" diff --git a/NothinFancy/dep/include/glm/gtx/fast_exponential.inl b/NothinFancy/dep/include/glm/gtx/fast_exponential.inl new file mode 100644 index 0000000..f139e50 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/fast_exponential.inl @@ -0,0 +1,136 @@ +/// @ref gtx_fast_exponential + +namespace glm +{ + // fastPow: + template + GLM_FUNC_QUALIFIER genType fastPow(genType x, genType y) + { + return exp(y * log(x)); + } + + template + GLM_FUNC_QUALIFIER vec fastPow(vec const& x, vec const& y) + { + return exp(y * log(x)); + } + + template + GLM_FUNC_QUALIFIER T fastPow(T x, int y) + { + T f = static_cast(1); + for(int i = 0; i < y; ++i) + f *= x; + return f; + } + + template + GLM_FUNC_QUALIFIER vec fastPow(vec const& x, vec const& y) + { + vec Result; + for(length_t i = 0, n = x.length(); i < n; ++i) + Result[i] = fastPow(x[i], y[i]); + return Result; + } + + // fastExp + // Note: This function provides accurate results only for value between -1 and 1, else avoid it. + template + GLM_FUNC_QUALIFIER T fastExp(T x) + { + // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. + // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f)))); + T x2 = x * x; + T x3 = x2 * x; + T x4 = x3 * x; + T x5 = x4 * x; + return T(1) + x + (x2 * T(0.5)) + (x3 * T(0.1666666667)) + (x4 * T(0.041666667)) + (x5 * T(0.008333333333)); + } + /* // Try to handle all values of float... but often shower than std::exp, glm::floor and the loop kill the performance + GLM_FUNC_QUALIFIER float fastExp(float x) + { + const float e = 2.718281828f; + const float IntegerPart = floor(x); + const float FloatPart = x - IntegerPart; + float z = 1.f; + + for(int i = 0; i < int(IntegerPart); ++i) + z *= e; + + const float x2 = FloatPart * FloatPart; + const float x3 = x2 * FloatPart; + const float x4 = x3 * FloatPart; + const float x5 = x4 * FloatPart; + return z * (1.0f + FloatPart + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)); + } + + // Increase accuracy on number bigger that 1 and smaller than -1 but it's not enough for high and negative numbers + GLM_FUNC_QUALIFIER float fastExp(float x) + { + // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. + // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f)))); + float x2 = x * x; + float x3 = x2 * x; + float x4 = x3 * x; + float x5 = x4 * x; + float x6 = x5 * x; + float x7 = x6 * x; + float x8 = x7 * x; + return 1.0f + x + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)+ (x6 * 0.00138888888888f) + (x7 * 0.000198412698f) + (x8 * 0.0000248015873f);; + } + */ + + template + GLM_FUNC_QUALIFIER vec fastExp(vec const& x) + { + return detail::functor1::call(fastExp, x); + } + + // fastLog + template + GLM_FUNC_QUALIFIER genType fastLog(genType x) + { + return std::log(x); + } + + /* Slower than the VC7.1 function... + GLM_FUNC_QUALIFIER float fastLog(float x) + { + float y1 = (x - 1.0f) / (x + 1.0f); + float y2 = y1 * y1; + return 2.0f * y1 * (1.0f + y2 * (0.3333333333f + y2 * (0.2f + y2 * 0.1428571429f))); + } + */ + + template + GLM_FUNC_QUALIFIER vec fastLog(vec const& x) + { + return detail::functor1::call(fastLog, x); + } + + //fastExp2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType fastExp2(genType x) + { + return fastExp(0.69314718055994530941723212145818f * x); + } + + template + GLM_FUNC_QUALIFIER vec fastExp2(vec const& x) + { + return detail::functor1::call(fastExp2, x); + } + + // fastLog2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType fastLog2(genType x) + { + return fastLog(x) / 0.69314718055994530941723212145818f; + } + + template + GLM_FUNC_QUALIFIER vec fastLog2(vec const& x) + { + return detail::functor1::call(fastLog2, x); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/fast_square_root.hpp b/NothinFancy/dep/include/glm/gtx/fast_square_root.hpp new file mode 100644 index 0000000..9fb3f2f --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/fast_square_root.hpp @@ -0,0 +1,92 @@ +/// @ref gtx_fast_square_root +/// @file glm/gtx/fast_square_root.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_fast_square_root GLM_GTX_fast_square_root +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Fast but less accurate implementations of square root based functions. +/// - Sqrt optimisation based on Newton's method, +/// www.gamedev.net/community/forums/topic.asp?topic id=139956 + +#pragma once + +// Dependency: +#include "../common.hpp" +#include "../exponential.hpp" +#include "../geometric.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_fast_square_root is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_fast_square_root extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_fast_square_root + /// @{ + + /// Faster than the common sqrt function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL genType fastSqrt(genType x); + + /// Faster than the common sqrt function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL vec fastSqrt(vec const& x); + + /// Faster than the common inversesqrt function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL genType fastInverseSqrt(genType x); + + /// Faster than the common inversesqrt function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL vec fastInverseSqrt(vec const& x); + + /// Faster than the common length function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL genType fastLength(genType x); + + /// Faster than the common length function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL T fastLength(vec const& x); + + /// Faster than the common distance function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL genType fastDistance(genType x, genType y); + + /// Faster than the common distance function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL T fastDistance(vec const& x, vec const& y); + + /// Faster than the common normalize function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL genType fastNormalize(genType const& x); + + /// @} +}// namespace glm + +#include "fast_square_root.inl" diff --git a/NothinFancy/dep/include/glm/gtx/fast_square_root.inl b/NothinFancy/dep/include/glm/gtx/fast_square_root.inl new file mode 100644 index 0000000..4e6c6de --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/fast_square_root.inl @@ -0,0 +1,75 @@ +/// @ref gtx_fast_square_root + +namespace glm +{ + // fastSqrt + template + GLM_FUNC_QUALIFIER genType fastSqrt(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fastSqrt' only accept floating-point input"); + + return genType(1) / fastInverseSqrt(x); + } + + template + GLM_FUNC_QUALIFIER vec fastSqrt(vec const& x) + { + return detail::functor1::call(fastSqrt, x); + } + + // fastInversesqrt + template + GLM_FUNC_QUALIFIER genType fastInverseSqrt(genType x) + { + return detail::compute_inversesqrt<1, genType, lowp, detail::is_aligned::value>::call(vec<1, genType, lowp>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec fastInverseSqrt(vec const& x) + { + return detail::compute_inversesqrt::value>::call(x); + } + + // fastLength + template + GLM_FUNC_QUALIFIER genType fastLength(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fastLength' only accept floating-point inputs"); + + return abs(x); + } + + template + GLM_FUNC_QUALIFIER T fastLength(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fastLength' only accept floating-point inputs"); + + return fastSqrt(dot(x, x)); + } + + // fastDistance + template + GLM_FUNC_QUALIFIER genType fastDistance(genType x, genType y) + { + return fastLength(y - x); + } + + template + GLM_FUNC_QUALIFIER T fastDistance(vec const& x, vec const& y) + { + return fastLength(y - x); + } + + // fastNormalize + template + GLM_FUNC_QUALIFIER genType fastNormalize(genType x) + { + return x > genType(0) ? genType(1) : -genType(1); + } + + template + GLM_FUNC_QUALIFIER vec fastNormalize(vec const& x) + { + return x * fastInverseSqrt(dot(x, x)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/fast_trigonometry.hpp b/NothinFancy/dep/include/glm/gtx/fast_trigonometry.hpp new file mode 100644 index 0000000..2650d6e --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/fast_trigonometry.hpp @@ -0,0 +1,79 @@ +/// @ref gtx_fast_trigonometry +/// @file glm/gtx/fast_trigonometry.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_fast_trigonometry GLM_GTX_fast_trigonometry +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Fast but less accurate implementations of trigonometric functions. + +#pragma once + +// Dependency: +#include "../gtc/constants.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_fast_trigonometry is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_fast_trigonometry extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_fast_trigonometry + /// @{ + + /// Wrap an angle to [0 2pi[ + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T wrapAngle(T angle); + + /// Faster than the common sin function but less accurate. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastSin(T angle); + + /// Faster than the common cos function but less accurate. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastCos(T angle); + + /// Faster than the common tan function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastTan(T angle); + + /// Faster than the common asin function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastAsin(T angle); + + /// Faster than the common acos function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastAcos(T angle); + + /// Faster than the common atan function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastAtan(T y, T x); + + /// Faster than the common atan function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastAtan(T angle); + + /// @} +}//namespace glm + +#include "fast_trigonometry.inl" diff --git a/NothinFancy/dep/include/glm/gtx/fast_trigonometry.inl b/NothinFancy/dep/include/glm/gtx/fast_trigonometry.inl new file mode 100644 index 0000000..1a710cb --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/fast_trigonometry.inl @@ -0,0 +1,142 @@ +/// @ref gtx_fast_trigonometry + +namespace glm{ +namespace detail +{ + template + GLM_FUNC_QUALIFIER vec taylorCos(vec const& x) + { + return static_cast(1) + - (x * x) * (1.f / 2.f) + + ((x * x) * (x * x)) * (1.f / 24.f) + - (((x * x) * (x * x)) * (x * x)) * (1.f / 720.f) + + (((x * x) * (x * x)) * ((x * x) * (x * x))) * (1.f / 40320.f); + } + + template + GLM_FUNC_QUALIFIER T cos_52s(T x) + { + T const xx(x * x); + return (T(0.9999932946) + xx * (T(-0.4999124376) + xx * (T(0.0414877472) + xx * T(-0.0012712095)))); + } + + template + GLM_FUNC_QUALIFIER vec cos_52s(vec const& x) + { + return detail::functor1::call(cos_52s, x); + } +}//namespace detail + + // wrapAngle + template + GLM_FUNC_QUALIFIER T wrapAngle(T angle) + { + return abs(mod(angle, two_pi())); + } + + template + GLM_FUNC_QUALIFIER vec wrapAngle(vec const& x) + { + return detail::functor1::call(wrapAngle, x); + } + + // cos + template + GLM_FUNC_QUALIFIER T fastCos(T x) + { + T const angle(wrapAngle(x)); + + if(angle < half_pi()) + return detail::cos_52s(angle); + if(angle < pi()) + return -detail::cos_52s(pi() - angle); + if(angle < (T(3) * half_pi())) + return -detail::cos_52s(angle - pi()); + + return detail::cos_52s(two_pi() - angle); + } + + template + GLM_FUNC_QUALIFIER vec fastCos(vec const& x) + { + return detail::functor1::call(fastCos, x); + } + + // sin + template + GLM_FUNC_QUALIFIER T fastSin(T x) + { + return fastCos(half_pi() - x); + } + + template + GLM_FUNC_QUALIFIER vec fastSin(vec const& x) + { + return detail::functor1::call(fastSin, x); + } + + // tan + template + GLM_FUNC_QUALIFIER T fastTan(T x) + { + return x + (x * x * x * T(0.3333333333)) + (x * x * x * x * x * T(0.1333333333333)) + (x * x * x * x * x * x * x * T(0.0539682539)); + } + + template + GLM_FUNC_QUALIFIER vec fastTan(vec const& x) + { + return detail::functor1::call(fastTan, x); + } + + // asin + template + GLM_FUNC_QUALIFIER T fastAsin(T x) + { + return x + (x * x * x * T(0.166666667)) + (x * x * x * x * x * T(0.075)) + (x * x * x * x * x * x * x * T(0.0446428571)) + (x * x * x * x * x * x * x * x * x * T(0.0303819444));// + (x * x * x * x * x * x * x * x * x * x * x * T(0.022372159)); + } + + template + GLM_FUNC_QUALIFIER vec fastAsin(vec const& x) + { + return detail::functor1::call(fastAsin, x); + } + + // acos + template + GLM_FUNC_QUALIFIER T fastAcos(T x) + { + return T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2) + } + + template + GLM_FUNC_QUALIFIER vec fastAcos(vec const& x) + { + return detail::functor1::call(fastAcos, x); + } + + // atan + template + GLM_FUNC_QUALIFIER T fastAtan(T y, T x) + { + T sgn = sign(y) * sign(x); + return abs(fastAtan(y / x)) * sgn; + } + + template + GLM_FUNC_QUALIFIER vec fastAtan(vec const& y, vec const& x) + { + return detail::functor2::call(fastAtan, y, x); + } + + template + GLM_FUNC_QUALIFIER T fastAtan(T x) + { + return x - (x * x * x * T(0.333333333333)) + (x * x * x * x * x * T(0.2)) - (x * x * x * x * x * x * x * T(0.1428571429)) + (x * x * x * x * x * x * x * x * x * T(0.111111111111)) - (x * x * x * x * x * x * x * x * x * x * x * T(0.0909090909)); + } + + template + GLM_FUNC_QUALIFIER vec fastAtan(vec const& x) + { + return detail::functor1::call(fastAtan, x); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/float_notmalize.inl b/NothinFancy/dep/include/glm/gtx/float_notmalize.inl new file mode 100644 index 0000000..8cdbc5a --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/float_notmalize.inl @@ -0,0 +1,13 @@ +/// @ref gtx_float_normalize + +#include + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec floatNormalize(vec const& v) + { + return vec(v) / static_cast(std::numeric_limits::max()); + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/functions.hpp b/NothinFancy/dep/include/glm/gtx/functions.hpp new file mode 100644 index 0000000..9f4166c --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/functions.hpp @@ -0,0 +1,56 @@ +/// @ref gtx_functions +/// @file glm/gtx/functions.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_functions GLM_GTX_functions +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// List of useful common functions. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/type_vec2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_functions is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_functions extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_functions + /// @{ + + /// 1D gauss function + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL T gauss( + T x, + T ExpectedValue, + T StandardDeviation); + + /// 2D gauss function + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL T gauss( + vec<2, T, Q> const& Coord, + vec<2, T, Q> const& ExpectedValue, + vec<2, T, Q> const& StandardDeviation); + + /// @} +}//namespace glm + +#include "functions.inl" + diff --git a/NothinFancy/dep/include/glm/gtx/functions.inl b/NothinFancy/dep/include/glm/gtx/functions.inl new file mode 100644 index 0000000..29cbb20 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/functions.inl @@ -0,0 +1,30 @@ +/// @ref gtx_functions + +#include "../exponential.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T gauss + ( + T x, + T ExpectedValue, + T StandardDeviation + ) + { + return exp(-((x - ExpectedValue) * (x - ExpectedValue)) / (static_cast(2) * StandardDeviation * StandardDeviation)) / (StandardDeviation * sqrt(static_cast(6.28318530717958647692528676655900576))); + } + + template + GLM_FUNC_QUALIFIER T gauss + ( + vec<2, T, Q> const& Coord, + vec<2, T, Q> const& ExpectedValue, + vec<2, T, Q> const& StandardDeviation + ) + { + vec<2, T, Q> const Squared = ((Coord - ExpectedValue) * (Coord - ExpectedValue)) / (static_cast(2) * StandardDeviation * StandardDeviation); + return exp(-(Squared.x + Squared.y)); + } +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/gtx/gradient_paint.hpp b/NothinFancy/dep/include/glm/gtx/gradient_paint.hpp new file mode 100644 index 0000000..6f85bf4 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/gradient_paint.hpp @@ -0,0 +1,53 @@ +/// @ref gtx_gradient_paint +/// @file glm/gtx/gradient_paint.hpp +/// +/// @see core (dependence) +/// @see gtx_optimum_pow (dependence) +/// +/// @defgroup gtx_gradient_paint GLM_GTX_gradient_paint +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Functions that return the color of procedural gradient for specific coordinates. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/optimum_pow.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_gradient_paint is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_gradient_paint extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_gradient_paint + /// @{ + + /// Return a color from a radial gradient. + /// @see - gtx_gradient_paint + template + GLM_FUNC_DECL T radialGradient( + vec<2, T, Q> const& Center, + T const& Radius, + vec<2, T, Q> const& Focal, + vec<2, T, Q> const& Position); + + /// Return a color from a linear gradient. + /// @see - gtx_gradient_paint + template + GLM_FUNC_DECL T linearGradient( + vec<2, T, Q> const& Point0, + vec<2, T, Q> const& Point1, + vec<2, T, Q> const& Position); + + /// @} +}// namespace glm + +#include "gradient_paint.inl" diff --git a/NothinFancy/dep/include/glm/gtx/gradient_paint.inl b/NothinFancy/dep/include/glm/gtx/gradient_paint.inl new file mode 100644 index 0000000..4c495e6 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/gradient_paint.inl @@ -0,0 +1,36 @@ +/// @ref gtx_gradient_paint + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T radialGradient + ( + vec<2, T, Q> const& Center, + T const& Radius, + vec<2, T, Q> const& Focal, + vec<2, T, Q> const& Position + ) + { + vec<2, T, Q> F = Focal - Center; + vec<2, T, Q> D = Position - Focal; + T Radius2 = pow2(Radius); + T Fx2 = pow2(F.x); + T Fy2 = pow2(F.y); + + T Numerator = (D.x * F.x + D.y * F.y) + sqrt(Radius2 * (pow2(D.x) + pow2(D.y)) - pow2(D.x * F.y - D.y * F.x)); + T Denominator = Radius2 - (Fx2 + Fy2); + return Numerator / Denominator; + } + + template + GLM_FUNC_QUALIFIER T linearGradient + ( + vec<2, T, Q> const& Point0, + vec<2, T, Q> const& Point1, + vec<2, T, Q> const& Position + ) + { + vec<2, T, Q> Dist = Point1 - Point0; + return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/handed_coordinate_space.hpp b/NothinFancy/dep/include/glm/gtx/handed_coordinate_space.hpp new file mode 100644 index 0000000..3c85968 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/handed_coordinate_space.hpp @@ -0,0 +1,50 @@ +/// @ref gtx_handed_coordinate_space +/// @file glm/gtx/handed_coordinate_space.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_handed_coordinate_space GLM_GTX_handed_coordinate_space +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// To know if a set of three basis vectors defines a right or left-handed coordinate system. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_handed_coordinate_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_handed_coordinate_space extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_handed_coordinate_space + /// @{ + + //! Return if a trihedron right handed or not. + //! From GLM_GTX_handed_coordinate_space extension. + template + GLM_FUNC_DECL bool rightHanded( + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal); + + //! Return if a trihedron left handed or not. + //! From GLM_GTX_handed_coordinate_space extension. + template + GLM_FUNC_DECL bool leftHanded( + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal); + + /// @} +}// namespace glm + +#include "handed_coordinate_space.inl" diff --git a/NothinFancy/dep/include/glm/gtx/handed_coordinate_space.inl b/NothinFancy/dep/include/glm/gtx/handed_coordinate_space.inl new file mode 100644 index 0000000..e43c17b --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/handed_coordinate_space.inl @@ -0,0 +1,26 @@ +/// @ref gtx_handed_coordinate_space + +namespace glm +{ + template + GLM_FUNC_QUALIFIER bool rightHanded + ( + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal + ) + { + return dot(cross(normal, tangent), binormal) > T(0); + } + + template + GLM_FUNC_QUALIFIER bool leftHanded + ( + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal + ) + { + return dot(cross(normal, tangent), binormal) < T(0); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/hash.hpp b/NothinFancy/dep/include/glm/gtx/hash.hpp new file mode 100644 index 0000000..05dae9f --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/hash.hpp @@ -0,0 +1,142 @@ +/// @ref gtx_hash +/// @file glm/gtx/hash.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_hash GLM_GTX_hash +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Add std::hash support for glm types + +#pragma once + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_hash is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_hash extension included") +# endif +#endif + +#include + +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../gtc/vec1.hpp" + +#include "../gtc/quaternion.hpp" +#include "../gtx/dual_quaternion.hpp" + +#include "../mat2x2.hpp" +#include "../mat2x3.hpp" +#include "../mat2x4.hpp" + +#include "../mat3x2.hpp" +#include "../mat3x3.hpp" +#include "../mat3x4.hpp" + +#include "../mat4x2.hpp" +#include "../mat4x3.hpp" +#include "../mat4x4.hpp" + +#if !GLM_HAS_CXX11_STL +# error "GLM_GTX_hash requires C++11 standard library support" +#endif + +namespace std +{ + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::vec<1, T, Q> const& v) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::vec<2, T, Q> const& v) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::vec<3, T, Q> const& v) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::vec<4, T, Q> const& v) const; + }; + + template + struct hash> + { + GLM_FUNC_DECL size_t operator()(glm::qua const& q) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::tdualquat const& q) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<2, 2, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<2, 3, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<2, 4, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<3, 2, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<3, 3, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<3, 4, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<4, 2, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<4, 3, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<4, 4, T,Q> const& m) const; + }; +} // namespace std + +#include "hash.inl" diff --git a/NothinFancy/dep/include/glm/gtx/hash.inl b/NothinFancy/dep/include/glm/gtx/hash.inl new file mode 100644 index 0000000..ff71ca9 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/hash.inl @@ -0,0 +1,184 @@ +/// @ref gtx_hash +/// +/// @see core (dependence) +/// +/// @defgroup gtx_hash GLM_GTX_hash +/// @ingroup gtx +/// +/// @brief Add std::hash support for glm types +/// +/// need to be included to use the features of this extension. + +namespace glm { +namespace detail +{ + GLM_INLINE void hash_combine(size_t &seed, size_t hash) + { + hash += 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= hash; + } +}} + +namespace std +{ + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::vec<1, T, Q> const& v) const + { + hash hasher; + return hasher(v.x); + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::vec<2, T, Q> const& v) const + { + size_t seed = 0; + hash hasher; + glm::detail::hash_combine(seed, hasher(v.x)); + glm::detail::hash_combine(seed, hasher(v.y)); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::vec<3, T, Q> const& v) const + { + size_t seed = 0; + hash hasher; + glm::detail::hash_combine(seed, hasher(v.x)); + glm::detail::hash_combine(seed, hasher(v.y)); + glm::detail::hash_combine(seed, hasher(v.z)); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::vec<4, T, Q> const& v) const + { + size_t seed = 0; + hash hasher; + glm::detail::hash_combine(seed, hasher(v.x)); + glm::detail::hash_combine(seed, hasher(v.y)); + glm::detail::hash_combine(seed, hasher(v.z)); + glm::detail::hash_combine(seed, hasher(v.w)); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::qua const& q) const + { + size_t seed = 0; + hash hasher; + glm::detail::hash_combine(seed, hasher(q.x)); + glm::detail::hash_combine(seed, hasher(q.y)); + glm::detail::hash_combine(seed, hasher(q.z)); + glm::detail::hash_combine(seed, hasher(q.w)); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::tdualquat const& q) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(q.real)); + glm::detail::hash_combine(seed, hasher(q.dual)); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<2, 2, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<2, 3, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<2, 4, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<3, 2, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<3, 3, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<3, 4, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<4, 2, T,Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + glm::detail::hash_combine(seed, hasher(m[3])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<4, 3, T,Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + glm::detail::hash_combine(seed, hasher(m[3])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<4, 4, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + glm::detail::hash_combine(seed, hasher(m[3])); + return seed; + } +} diff --git a/NothinFancy/dep/include/glm/gtx/integer.hpp b/NothinFancy/dep/include/glm/gtx/integer.hpp new file mode 100644 index 0000000..d0b4c61 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/integer.hpp @@ -0,0 +1,76 @@ +/// @ref gtx_integer +/// @file glm/gtx/integer.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_integer GLM_GTX_integer +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Add support for integer for core functions + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/integer.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_integer is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_integer extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_integer + /// @{ + + //! Returns x raised to the y power. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL int pow(int x, uint y); + + //! Returns the positive square root of x. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL int sqrt(int x); + + //! Returns the floor log2 of x. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL unsigned int floor_log2(unsigned int x); + + //! Modulus. Returns x - y * floor(x / y) for each component in x using the floating point value y. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL int mod(int x, int y); + + //! Return the factorial value of a number (!12 max, integer only) + //! From GLM_GTX_integer extension. + template + GLM_FUNC_DECL genType factorial(genType const& x); + + //! 32bit signed integer. + //! From GLM_GTX_integer extension. + typedef signed int sint; + + //! Returns x raised to the y power. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL uint pow(uint x, uint y); + + //! Returns the positive square root of x. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL uint sqrt(uint x); + + //! Modulus. Returns x - y * floor(x / y) for each component in x using the floating point value y. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL uint mod(uint x, uint y); + + //! Returns the number of leading zeros. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL uint nlz(uint x); + + /// @} +}//namespace glm + +#include "integer.inl" diff --git a/NothinFancy/dep/include/glm/gtx/integer.inl b/NothinFancy/dep/include/glm/gtx/integer.inl new file mode 100644 index 0000000..956366b --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/integer.inl @@ -0,0 +1,185 @@ +/// @ref gtx_integer + +namespace glm +{ + // pow + GLM_FUNC_QUALIFIER int pow(int x, uint y) + { + if(y == 0) + return x >= 0 ? 1 : -1; + + int result = x; + for(uint i = 1; i < y; ++i) + result *= x; + return result; + } + + // sqrt: From Christopher J. Musial, An integer square root, Graphics Gems, 1990, page 387 + GLM_FUNC_QUALIFIER int sqrt(int x) + { + if(x <= 1) return x; + + int NextTrial = x >> 1; + int CurrentAnswer; + + do + { + CurrentAnswer = NextTrial; + NextTrial = (NextTrial + x / NextTrial) >> 1; + } while(NextTrial < CurrentAnswer); + + return CurrentAnswer; + } + +// Henry Gordon Dietz: http://aggregate.org/MAGIC/ +namespace detail +{ + GLM_FUNC_QUALIFIER unsigned int ones32(unsigned int x) + { + /* 32-bit recursive reduction using SWAR... + but first step is mapping 2-bit values + into sum of 2 1-bit values in sneaky way + */ + x -= ((x >> 1) & 0x55555555); + x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); + x = (((x >> 4) + x) & 0x0f0f0f0f); + x += (x >> 8); + x += (x >> 16); + return(x & 0x0000003f); + } +}//namespace detail + + // Henry Gordon Dietz: http://aggregate.org/MAGIC/ +/* + GLM_FUNC_QUALIFIER unsigned int floor_log2(unsigned int x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + + return _detail::ones32(x) >> 1; + } +*/ + // mod + GLM_FUNC_QUALIFIER int mod(int x, int y) + { + return ((x % y) + y) % y; + } + + // factorial (!12 max, integer only) + template + GLM_FUNC_QUALIFIER genType factorial(genType const& x) + { + genType Temp = x; + genType Result; + for(Result = 1; Temp > 1; --Temp) + Result *= Temp; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> factorial( + vec<2, T, Q> const& x) + { + return vec<2, T, Q>( + factorial(x.x), + factorial(x.y)); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> factorial( + vec<3, T, Q> const& x) + { + return vec<3, T, Q>( + factorial(x.x), + factorial(x.y), + factorial(x.z)); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> factorial( + vec<4, T, Q> const& x) + { + return vec<4, T, Q>( + factorial(x.x), + factorial(x.y), + factorial(x.z), + factorial(x.w)); + } + + GLM_FUNC_QUALIFIER uint pow(uint x, uint y) + { + if (y == 0) + return 1u; + + uint result = x; + for(uint i = 1; i < y; ++i) + result *= x; + return result; + } + + GLM_FUNC_QUALIFIER uint sqrt(uint x) + { + if(x <= 1) return x; + + uint NextTrial = x >> 1; + uint CurrentAnswer; + + do + { + CurrentAnswer = NextTrial; + NextTrial = (NextTrial + x / NextTrial) >> 1; + } while(NextTrial < CurrentAnswer); + + return CurrentAnswer; + } + + GLM_FUNC_QUALIFIER uint mod(uint x, uint y) + { + return x - y * (x / y); + } + +#if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC)) + + GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) + { + return 31u - findMSB(x); + } + +#else + + // Hackers Delight: http://www.hackersdelight.org/HDcode/nlz.c.txt + GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) + { + int y, m, n; + + y = -int(x >> 16); // If left half of x is 0, + m = (y >> 16) & 16; // set n = 16. If left half + n = 16 - m; // is nonzero, set n = 0 and + x = x >> m; // shift x right 16. + // Now x is of the form 0000xxxx. + y = x - 0x100; // If positions 8-15 are 0, + m = (y >> 16) & 8; // add 8 to n and shift x left 8. + n = n + m; + x = x << m; + + y = x - 0x1000; // If positions 12-15 are 0, + m = (y >> 16) & 4; // add 4 to n and shift x left 4. + n = n + m; + x = x << m; + + y = x - 0x4000; // If positions 14-15 are 0, + m = (y >> 16) & 2; // add 2 to n and shift x left 2. + n = n + m; + x = x << m; + + y = x >> 14; // Set y = 0, 1, 2, or 3. + m = y & ~(y >> 1); // Set m = 0, 1, 2, or 2 resp. + return unsigned(n + 2 - m); + } + +#endif//(GLM_COMPILER) + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/intersect.hpp b/NothinFancy/dep/include/glm/gtx/intersect.hpp new file mode 100644 index 0000000..3c78f2b --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/intersect.hpp @@ -0,0 +1,92 @@ +/// @ref gtx_intersect +/// @file glm/gtx/intersect.hpp +/// +/// @see core (dependence) +/// @see gtx_closest_point (dependence) +/// +/// @defgroup gtx_intersect GLM_GTX_intersect +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Add intersection functions + +#pragma once + +// Dependency: +#include +#include +#include "../glm.hpp" +#include "../geometric.hpp" +#include "../gtx/closest_point.hpp" +#include "../gtx/vector_query.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_closest_point extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_intersect + /// @{ + + //! Compute the intersection of a ray and a plane. + //! Ray direction and plane normal must be unit length. + //! From GLM_GTX_intersect extension. + template + GLM_FUNC_DECL bool intersectRayPlane( + genType const& orig, genType const& dir, + genType const& planeOrig, genType const& planeNormal, + typename genType::value_type & intersectionDistance); + + //! Compute the intersection of a ray and a triangle. + /// Based om Tomas Möller implementation http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/raytri/ + //! From GLM_GTX_intersect extension. + template + GLM_FUNC_DECL bool intersectRayTriangle( + vec<3, T, Q> const& orig, vec<3, T, Q> const& dir, + vec<3, T, Q> const& v0, vec<3, T, Q> const& v1, vec<3, T, Q> const& v2, + vec<2, T, Q>& baryPosition, T& distance); + + //! Compute the intersection of a line and a triangle. + //! From GLM_GTX_intersect extension. + template + GLM_FUNC_DECL bool intersectLineTriangle( + genType const& orig, genType const& dir, + genType const& vert0, genType const& vert1, genType const& vert2, + genType & position); + + //! Compute the intersection distance of a ray and a sphere. + //! The ray direction vector is unit length. + //! From GLM_GTX_intersect extension. + template + GLM_FUNC_DECL bool intersectRaySphere( + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, typename genType::value_type const sphereRadiusSquered, + typename genType::value_type & intersectionDistance); + + //! Compute the intersection of a ray and a sphere. + //! From GLM_GTX_intersect extension. + template + GLM_FUNC_DECL bool intersectRaySphere( + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, const typename genType::value_type sphereRadius, + genType & intersectionPosition, genType & intersectionNormal); + + //! Compute the intersection of a line and a sphere. + //! From GLM_GTX_intersect extension + template + GLM_FUNC_DECL bool intersectLineSphere( + genType const& point0, genType const& point1, + genType const& sphereCenter, typename genType::value_type sphereRadius, + genType & intersectionPosition1, genType & intersectionNormal1, + genType & intersectionPosition2 = genType(), genType & intersectionNormal2 = genType()); + + /// @} +}//namespace glm + +#include "intersect.inl" diff --git a/NothinFancy/dep/include/glm/gtx/intersect.inl b/NothinFancy/dep/include/glm/gtx/intersect.inl new file mode 100644 index 0000000..54ecb4d --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/intersect.inl @@ -0,0 +1,200 @@ +/// @ref gtx_intersect + +namespace glm +{ + template + GLM_FUNC_QUALIFIER bool intersectRayPlane + ( + genType const& orig, genType const& dir, + genType const& planeOrig, genType const& planeNormal, + typename genType::value_type & intersectionDistance + ) + { + typename genType::value_type d = glm::dot(dir, planeNormal); + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + + if(glm::abs(d) > Epsilon) // if dir and planeNormal are not perpendicular + { + typename genType::value_type const tmp_intersectionDistance = glm::dot(planeOrig - orig, planeNormal) / d; + if (tmp_intersectionDistance > static_cast(0)) { // allow only intersections + intersectionDistance = tmp_intersectionDistance; + return true; + } + } + + return false; + } + + template + GLM_FUNC_QUALIFIER bool intersectRayTriangle + ( + vec<3, T, Q> const& orig, vec<3, T, Q> const& dir, + vec<3, T, Q> const& vert0, vec<3, T, Q> const& vert1, vec<3, T, Q> const& vert2, + vec<2, T, Q>& baryPosition, T& distance + ) + { + // find vectors for two edges sharing vert0 + vec<3, T, Q> const edge1 = vert1 - vert0; + vec<3, T, Q> const edge2 = vert2 - vert0; + + // begin calculating determinant - also used to calculate U parameter + vec<3, T, Q> const p = glm::cross(dir, edge2); + + // if determinant is near zero, ray lies in plane of triangle + T const det = glm::dot(edge1, p); + + vec<3, T, Q> Perpendicular(0); + + if(det > std::numeric_limits::epsilon()) + { + // calculate distance from vert0 to ray origin + vec<3, T, Q> const dist = orig - vert0; + + // calculate U parameter and test bounds + baryPosition.x = glm::dot(dist, p); + if(baryPosition.x < static_cast(0) || baryPosition.x > det) + return false; + + // prepare to test V parameter + Perpendicular = glm::cross(dist, edge1); + + // calculate V parameter and test bounds + baryPosition.y = glm::dot(dir, Perpendicular); + if((baryPosition.y < static_cast(0)) || ((baryPosition.x + baryPosition.y) > det)) + return false; + } + else if(det < -std::numeric_limits::epsilon()) + { + // calculate distance from vert0 to ray origin + vec<3, T, Q> const dist = orig - vert0; + + // calculate U parameter and test bounds + baryPosition.x = glm::dot(dist, p); + if((baryPosition.x > static_cast(0)) || (baryPosition.x < det)) + return false; + + // prepare to test V parameter + Perpendicular = glm::cross(dist, edge1); + + // calculate V parameter and test bounds + baryPosition.y = glm::dot(dir, Perpendicular); + if((baryPosition.y > static_cast(0)) || (baryPosition.x + baryPosition.y < det)) + return false; + } + else + return false; // ray is parallel to the plane of the triangle + + T inv_det = static_cast(1) / det; + + // calculate distance, ray intersects triangle + distance = glm::dot(edge2, Perpendicular) * inv_det; + baryPosition *= inv_det; + + return true; + } + + template + GLM_FUNC_QUALIFIER bool intersectLineTriangle + ( + genType const& orig, genType const& dir, + genType const& vert0, genType const& vert1, genType const& vert2, + genType & position + ) + { + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + + genType edge1 = vert1 - vert0; + genType edge2 = vert2 - vert0; + + genType Perpendicular = cross(dir, edge2); + + float det = dot(edge1, Perpendicular); + + if (det > -Epsilon && det < Epsilon) + return false; + typename genType::value_type inv_det = typename genType::value_type(1) / det; + + genType Tengant = orig - vert0; + + position.y = dot(Tengant, Perpendicular) * inv_det; + if (position.y < typename genType::value_type(0) || position.y > typename genType::value_type(1)) + return false; + + genType Cotengant = cross(Tengant, edge1); + + position.z = dot(dir, Cotengant) * inv_det; + if (position.z < typename genType::value_type(0) || position.y + position.z > typename genType::value_type(1)) + return false; + + position.x = dot(edge2, Cotengant) * inv_det; + + return true; + } + + template + GLM_FUNC_QUALIFIER bool intersectRaySphere + ( + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, const typename genType::value_type sphereRadiusSquered, + typename genType::value_type & intersectionDistance + ) + { + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + genType diff = sphereCenter - rayStarting; + typename genType::value_type t0 = dot(diff, rayNormalizedDirection); + typename genType::value_type dSquared = dot(diff, diff) - t0 * t0; + if( dSquared > sphereRadiusSquered ) + { + return false; + } + typename genType::value_type t1 = sqrt( sphereRadiusSquered - dSquared ); + intersectionDistance = t0 > t1 + Epsilon ? t0 - t1 : t0 + t1; + return intersectionDistance > Epsilon; + } + + template + GLM_FUNC_QUALIFIER bool intersectRaySphere + ( + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, const typename genType::value_type sphereRadius, + genType & intersectionPosition, genType & intersectionNormal + ) + { + typename genType::value_type distance; + if( intersectRaySphere( rayStarting, rayNormalizedDirection, sphereCenter, sphereRadius * sphereRadius, distance ) ) + { + intersectionPosition = rayStarting + rayNormalizedDirection * distance; + intersectionNormal = (intersectionPosition - sphereCenter) / sphereRadius; + return true; + } + return false; + } + + template + GLM_FUNC_QUALIFIER bool intersectLineSphere + ( + genType const& point0, genType const& point1, + genType const& sphereCenter, typename genType::value_type sphereRadius, + genType & intersectionPoint1, genType & intersectionNormal1, + genType & intersectionPoint2, genType & intersectionNormal2 + ) + { + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + genType dir = normalize(point1 - point0); + genType diff = sphereCenter - point0; + typename genType::value_type t0 = dot(diff, dir); + typename genType::value_type dSquared = dot(diff, diff) - t0 * t0; + if( dSquared > sphereRadius * sphereRadius ) + { + return false; + } + typename genType::value_type t1 = sqrt( sphereRadius * sphereRadius - dSquared ); + if( t0 < t1 + Epsilon ) + t1 = -t1; + intersectionPoint1 = point0 + dir * (t0 - t1); + intersectionNormal1 = (intersectionPoint1 - sphereCenter) / sphereRadius; + intersectionPoint2 = point0 + dir * (t0 + t1); + intersectionNormal2 = (intersectionPoint2 - sphereCenter) / sphereRadius; + return true; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/io.hpp b/NothinFancy/dep/include/glm/gtx/io.hpp new file mode 100644 index 0000000..8d974f0 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/io.hpp @@ -0,0 +1,201 @@ +/// @ref gtx_io +/// @file glm/gtx/io.hpp +/// @author Jan P Springer (regnirpsj@gmail.com) +/// +/// @see core (dependence) +/// @see gtc_matrix_access (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_io GLM_GTX_io +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// std::[w]ostream support for glm types +/// +/// std::[w]ostream support for glm types + qualifier/width/etc. manipulators +/// based on howard hinnant's std::chrono io proposal +/// [http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html] + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/quaternion.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_io is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_io extension included") +# endif +#endif + +#include // std::basic_ostream<> (fwd) +#include // std::locale, std::locale::facet, std::locale::id +#include // std::pair<> + +namespace glm +{ + /// @addtogroup gtx_io + /// @{ + + namespace io + { + enum order_type { column_major, row_major}; + + template + class format_punct : public std::locale::facet + { + typedef CTy char_type; + + public: + + static std::locale::id id; + + bool formatted; + unsigned precision; + unsigned width; + char_type separator; + char_type delim_left; + char_type delim_right; + char_type space; + char_type newline; + order_type order; + + GLM_FUNC_DECL explicit format_punct(size_t a = 0); + GLM_FUNC_DECL explicit format_punct(format_punct const&); + }; + + template > + class basic_state_saver { + + public: + + GLM_FUNC_DECL explicit basic_state_saver(std::basic_ios&); + GLM_FUNC_DECL ~basic_state_saver(); + + private: + + typedef ::std::basic_ios state_type; + typedef typename state_type::char_type char_type; + typedef ::std::ios_base::fmtflags flags_type; + typedef ::std::streamsize streamsize_type; + typedef ::std::locale const locale_type; + + state_type& state_; + flags_type flags_; + streamsize_type precision_; + streamsize_type width_; + char_type fill_; + locale_type locale_; + + GLM_FUNC_DECL basic_state_saver& operator=(basic_state_saver const&); + }; + + typedef basic_state_saver state_saver; + typedef basic_state_saver wstate_saver; + + template > + class basic_format_saver + { + public: + + GLM_FUNC_DECL explicit basic_format_saver(std::basic_ios&); + GLM_FUNC_DECL ~basic_format_saver(); + + private: + + basic_state_saver const bss_; + + GLM_FUNC_DECL basic_format_saver& operator=(basic_format_saver const&); + }; + + typedef basic_format_saver format_saver; + typedef basic_format_saver wformat_saver; + + struct precision + { + unsigned value; + + GLM_FUNC_DECL explicit precision(unsigned); + }; + + struct width + { + unsigned value; + + GLM_FUNC_DECL explicit width(unsigned); + }; + + template + struct delimeter + { + CTy value[3]; + + GLM_FUNC_DECL explicit delimeter(CTy /* left */, CTy /* right */, CTy /* separator */ = ','); + }; + + struct order + { + order_type value; + + GLM_FUNC_DECL explicit order(order_type); + }; + + // functions, inlined (inline) + + template + FTy const& get_facet(std::basic_ios&); + template + std::basic_ios& formatted(std::basic_ios&); + template + std::basic_ios& unformattet(std::basic_ios&); + + template + std::basic_ostream& operator<<(std::basic_ostream&, precision const&); + template + std::basic_ostream& operator<<(std::basic_ostream&, width const&); + template + std::basic_ostream& operator<<(std::basic_ostream&, delimeter const&); + template + std::basic_ostream& operator<<(std::basic_ostream&, order const&); + }//namespace io + + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, qua const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, vec<1, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, vec<2, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, vec<3, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, vec<4, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<2, 2, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<2, 3, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<2, 4, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<3, 2, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<3, 3, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<3, 4, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<4, 2, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<4, 3, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<4, 4, T, Q> const&); + + template + GLM_FUNC_DECL std::basic_ostream & operator<<(std::basic_ostream &, + std::pair const, mat<4, 4, T, Q> const> const&); + + /// @} +}//namespace glm + +#include "io.inl" diff --git a/NothinFancy/dep/include/glm/gtx/io.inl b/NothinFancy/dep/include/glm/gtx/io.inl new file mode 100644 index 0000000..a3a1bb6 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/io.inl @@ -0,0 +1,440 @@ +/// @ref gtx_io +/// @author Jan P Springer (regnirpsj@gmail.com) + +#include // std::fixed, std::setfill<>, std::setprecision, std::right, std::setw +#include // std::basic_ostream<> +#include "../gtc/matrix_access.hpp" // glm::col, glm::row +#include "../gtx/type_trait.hpp" // glm::type<> + +namespace glm{ +namespace io +{ + template + GLM_FUNC_QUALIFIER format_punct::format_punct(size_t a) + : std::locale::facet(a) + , formatted(true) + , precision(3) + , width(1 + 4 + 1 + precision) + , separator(',') + , delim_left('[') + , delim_right(']') + , space(' ') + , newline('\n') + , order(column_major) + {} + + template + GLM_FUNC_QUALIFIER format_punct::format_punct(format_punct const& a) + : std::locale::facet(0) + , formatted(a.formatted) + , precision(a.precision) + , width(a.width) + , separator(a.separator) + , delim_left(a.delim_left) + , delim_right(a.delim_right) + , space(a.space) + , newline(a.newline) + , order(a.order) + {} + + template std::locale::id format_punct::id; + + template + GLM_FUNC_QUALIFIER basic_state_saver::basic_state_saver(std::basic_ios& a) + : state_(a) + , flags_(a.flags()) + , precision_(a.precision()) + , width_(a.width()) + , fill_(a.fill()) + , locale_(a.getloc()) + {} + + template + GLM_FUNC_QUALIFIER basic_state_saver::~basic_state_saver() + { + state_.imbue(locale_); + state_.fill(fill_); + state_.width(width_); + state_.precision(precision_); + state_.flags(flags_); + } + + template + GLM_FUNC_QUALIFIER basic_format_saver::basic_format_saver(std::basic_ios& a) + : bss_(a) + { + a.imbue(std::locale(a.getloc(), new format_punct(get_facet >(a)))); + } + + template + GLM_FUNC_QUALIFIER + basic_format_saver::~basic_format_saver() + {} + + GLM_FUNC_QUALIFIER precision::precision(unsigned a) + : value(a) + {} + + GLM_FUNC_QUALIFIER width::width(unsigned a) + : value(a) + {} + + template + GLM_FUNC_QUALIFIER delimeter::delimeter(CTy a, CTy b, CTy c) + : value() + { + value[0] = a; + value[1] = b; + value[2] = c; + } + + GLM_FUNC_QUALIFIER order::order(order_type a) + : value(a) + {} + + template + GLM_FUNC_QUALIFIER FTy const& get_facet(std::basic_ios& ios) + { + if(!std::has_facet(ios.getloc())) + ios.imbue(std::locale(ios.getloc(), new FTy)); + + return std::use_facet(ios.getloc()); + } + + template + GLM_FUNC_QUALIFIER std::basic_ios& formatted(std::basic_ios& ios) + { + const_cast&>(get_facet >(ios)).formatted = true; + return ios; + } + + template + GLM_FUNC_QUALIFIER std::basic_ios& unformatted(std::basic_ios& ios) + { + const_cast&>(get_facet >(ios)).formatted = false; + return ios; + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, precision const& a) + { + const_cast&>(get_facet >(os)).precision = a.value; + return os; + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, width const& a) + { + const_cast&>(get_facet >(os)).width = a.value; + return os; + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, delimeter const& a) + { + format_punct & fmt(const_cast&>(get_facet >(os))); + + fmt.delim_left = a.value[0]; + fmt.delim_right = a.value[1]; + fmt.separator = a.value[2]; + + return os; + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, order const& a) + { + const_cast&>(get_facet >(os)).order = a.value; + return os; + } +} // namespace io + +namespace detail +{ + template + GLM_FUNC_QUALIFIER std::basic_ostream& + print_vector_on(std::basic_ostream& os, V const& a) + { + typename std::basic_ostream::sentry const cerberus(os); + + if(cerberus) + { + io::format_punct const& fmt(io::get_facet >(os)); + + length_t const& components(type::components); + + if(fmt.formatted) + { + io::basic_state_saver const bss(os); + + os << std::fixed << std::right << std::setprecision(fmt.precision) << std::setfill(fmt.space) << fmt.delim_left; + + for(length_t i(0); i < components; ++i) + { + os << std::setw(fmt.width) << a[i]; + if(components-1 != i) + os << fmt.separator; + } + + os << fmt.delim_right; + } + else + { + for(length_t i(0); i < components; ++i) + { + os << a[i]; + + if(components-1 != i) + os << fmt.space; + } + } + } + + return os; + } +}//namespace detail + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, qua const& a) + { + return detail::print_vector_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, vec<1, T, Q> const& a) + { + return detail::print_vector_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, vec<2, T, Q> const& a) + { + return detail::print_vector_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, vec<3, T, Q> const& a) + { + return detail::print_vector_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, vec<4, T, Q> const& a) + { + return detail::print_vector_on(os, a); + } + +namespace detail +{ + template class M, length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream& print_matrix_on(std::basic_ostream& os, M const& a) + { + typename std::basic_ostream::sentry const cerberus(os); + + if(cerberus) + { + io::format_punct const& fmt(io::get_facet >(os)); + + length_t const& cols(type >::cols); + length_t const& rows(type >::rows); + + if(fmt.formatted) + { + os << fmt.newline << fmt.delim_left; + + switch(fmt.order) + { + case io::column_major: + { + for(length_t i(0); i < rows; ++i) + { + if (0 != i) + os << fmt.space; + + os << row(a, i); + + if(rows-1 != i) + os << fmt.newline; + } + } + break; + + case io::row_major: + { + for(length_t i(0); i < cols; ++i) + { + if(0 != i) + os << fmt.space; + + os << column(a, i); + + if(cols-1 != i) + os << fmt.newline; + } + } + break; + } + + os << fmt.delim_right; + } + else + { + switch (fmt.order) + { + case io::column_major: + { + for(length_t i(0); i < cols; ++i) + { + os << column(a, i); + + if(cols - 1 != i) + os << fmt.space; + } + } + break; + + case io::row_major: + { + for (length_t i(0); i < rows; ++i) + { + os << row(a, i); + + if (rows-1 != i) + os << fmt.space; + } + } + break; + } + } + } + + return os; + } +}//namespace detail + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, mat<2, 2, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, mat<2, 3, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, mat<2, 4, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, mat<3, 2, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, mat<3, 3, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, mat<3, 4, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, mat<4, 2, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, mat<4, 3, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, mat<4, 4, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + +namespace detail +{ + template class M, length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream& print_matrix_pair_on(std::basic_ostream& os, std::pair const, M const> const& a) + { + typename std::basic_ostream::sentry const cerberus(os); + + if(cerberus) + { + io::format_punct const& fmt(io::get_facet >(os)); + M const& ml(a.first); + M const& mr(a.second); + length_t const& cols(type >::cols); + length_t const& rows(type >::rows); + + if(fmt.formatted) + { + os << fmt.newline << fmt.delim_left; + + switch(fmt.order) + { + case io::column_major: + { + for(length_t i(0); i < rows; ++i) + { + if(0 != i) + os << fmt.space; + + os << row(ml, i) << ((rows-1 != i) ? fmt.space : fmt.delim_right) << fmt.space << ((0 != i) ? fmt.space : fmt.delim_left) << row(mr, i); + + if(rows-1 != i) + os << fmt.newline; + } + } + break; + case io::row_major: + { + for(length_t i(0); i < cols; ++i) + { + if(0 != i) + os << fmt.space; + + os << column(ml, i) << ((cols-1 != i) ? fmt.space : fmt.delim_right) << fmt.space << ((0 != i) ? fmt.space : fmt.delim_left) << column(mr, i); + + if(cols-1 != i) + os << fmt.newline; + } + } + break; + } + + os << fmt.delim_right; + } + else + { + os << ml << fmt.space << mr; + } + } + + return os; + } +}//namespace detail + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<( + std::basic_ostream & os, + std::pair const, + mat<4, 4, T, Q> const> const& a) + { + return detail::print_matrix_pair_on(os, a); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/log_base.hpp b/NothinFancy/dep/include/glm/gtx/log_base.hpp new file mode 100644 index 0000000..ba28c9d --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/log_base.hpp @@ -0,0 +1,48 @@ +/// @ref gtx_log_base +/// @file glm/gtx/log_base.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_log_base GLM_GTX_log_base +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Logarithm for any base. base can be a vector or a scalar. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_log_base is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_log_base extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_log_base + /// @{ + + /// Logarithm for any base. + /// From GLM_GTX_log_base. + template + GLM_FUNC_DECL genType log( + genType const& x, + genType const& base); + + /// Logarithm for any base. + /// From GLM_GTX_log_base. + template + GLM_FUNC_DECL vec sign( + vec const& x, + vec const& base); + + /// @} +}//namespace glm + +#include "log_base.inl" diff --git a/NothinFancy/dep/include/glm/gtx/log_base.inl b/NothinFancy/dep/include/glm/gtx/log_base.inl new file mode 100644 index 0000000..4bbb8e8 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/log_base.inl @@ -0,0 +1,16 @@ +/// @ref gtx_log_base + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType log(genType const& x, genType const& base) + { + return glm::log(x) / glm::log(base); + } + + template + GLM_FUNC_QUALIFIER vec log(vec const& x, vec const& base) + { + return glm::log(x) / glm::log(base); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/matrix_cross_product.hpp b/NothinFancy/dep/include/glm/gtx/matrix_cross_product.hpp new file mode 100644 index 0000000..1e585f9 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_cross_product.hpp @@ -0,0 +1,47 @@ +/// @ref gtx_matrix_cross_product +/// @file glm/gtx/matrix_cross_product.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_matrix_cross_product GLM_GTX_matrix_cross_product +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Build cross product matrices + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_cross_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_cross_product extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_cross_product + /// @{ + + //! Build a cross product matrix. + //! From GLM_GTX_matrix_cross_product extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> matrixCross3( + vec<3, T, Q> const& x); + + //! Build a cross product matrix. + //! From GLM_GTX_matrix_cross_product extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> matrixCross4( + vec<3, T, Q> const& x); + + /// @} +}//namespace glm + +#include "matrix_cross_product.inl" diff --git a/NothinFancy/dep/include/glm/gtx/matrix_cross_product.inl b/NothinFancy/dep/include/glm/gtx/matrix_cross_product.inl new file mode 100644 index 0000000..3a15397 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_cross_product.inl @@ -0,0 +1,37 @@ +/// @ref gtx_matrix_cross_product + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> matrixCross3 + ( + vec<3, T, Q> const& x + ) + { + mat<3, 3, T, Q> Result(T(0)); + Result[0][1] = x.z; + Result[1][0] = -x.z; + Result[0][2] = -x.y; + Result[2][0] = x.y; + Result[1][2] = x.x; + Result[2][1] = -x.x; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> matrixCross4 + ( + vec<3, T, Q> const& x + ) + { + mat<4, 4, T, Q> Result(T(0)); + Result[0][1] = x.z; + Result[1][0] = -x.z; + Result[0][2] = -x.y; + Result[2][0] = x.y; + Result[1][2] = x.x; + Result[2][1] = -x.x; + return Result; + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/matrix_decompose.hpp b/NothinFancy/dep/include/glm/gtx/matrix_decompose.hpp new file mode 100644 index 0000000..acd7a7f --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_decompose.hpp @@ -0,0 +1,46 @@ +/// @ref gtx_matrix_decompose +/// @file glm/gtx/matrix_decompose.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_decompose GLM_GTX_matrix_decompose +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Decomposes a model matrix to translations, rotation and scale components + +#pragma once + +// Dependencies +#include "../mat4x4.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../geometric.hpp" +#include "../gtc/quaternion.hpp" +#include "../gtc/matrix_transform.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_decompose is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_decompose extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_decompose + /// @{ + + /// Decomposes a model matrix to translations, rotation and scale components + /// @see gtx_matrix_decompose + template + GLM_FUNC_DECL bool decompose( + mat<4, 4, T, Q> const& modelMatrix, + vec<3, T, Q> & scale, qua & orientation, vec<3, T, Q> & translation, vec<3, T, Q> & skew, vec<4, T, Q> & perspective); + + /// @} +}//namespace glm + +#include "matrix_decompose.inl" diff --git a/NothinFancy/dep/include/glm/gtx/matrix_decompose.inl b/NothinFancy/dep/include/glm/gtx/matrix_decompose.inl new file mode 100644 index 0000000..694f5ec --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_decompose.inl @@ -0,0 +1,186 @@ +/// @ref gtx_matrix_decompose + +#include "../gtc/constants.hpp" +#include "../gtc/epsilon.hpp" + +namespace glm{ +namespace detail +{ + /// Make a linear combination of two vectors and return the result. + // result = (a * ascl) + (b * bscl) + template + GLM_FUNC_QUALIFIER vec<3, T, Q> combine( + vec<3, T, Q> const& a, + vec<3, T, Q> const& b, + T ascl, T bscl) + { + return (a * ascl) + (b * bscl); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> scale(vec<3, T, Q> const& v, T desiredLength) + { + return v * desiredLength / length(v); + } +}//namespace detail + + // Matrix decompose + // http://www.opensource.apple.com/source/WebCore/WebCore-514/platform/graphics/transforms/TransformationMatrix.cpp + // Decomposes the mode matrix to translations,rotation scale components + + template + GLM_FUNC_QUALIFIER bool decompose(mat<4, 4, T, Q> const& ModelMatrix, vec<3, T, Q> & Scale, qua & Orientation, vec<3, T, Q> & Translation, vec<3, T, Q> & Skew, vec<4, T, Q> & Perspective) + { + mat<4, 4, T, Q> LocalMatrix(ModelMatrix); + + // Normalize the matrix. + if(epsilonEqual(LocalMatrix[3][3], static_cast(0), epsilon())) + return false; + + for(length_t i = 0; i < 4; ++i) + for(length_t j = 0; j < 4; ++j) + LocalMatrix[i][j] /= LocalMatrix[3][3]; + + // perspectiveMatrix is used to solve for perspective, but it also provides + // an easy way to test for singularity of the upper 3x3 component. + mat<4, 4, T, Q> PerspectiveMatrix(LocalMatrix); + + for(length_t i = 0; i < 3; i++) + PerspectiveMatrix[i][3] = static_cast(0); + PerspectiveMatrix[3][3] = static_cast(1); + + /// TODO: Fixme! + if(epsilonEqual(determinant(PerspectiveMatrix), static_cast(0), epsilon())) + return false; + + // First, isolate perspective. This is the messiest. + if( + epsilonNotEqual(LocalMatrix[0][3], static_cast(0), epsilon()) || + epsilonNotEqual(LocalMatrix[1][3], static_cast(0), epsilon()) || + epsilonNotEqual(LocalMatrix[2][3], static_cast(0), epsilon())) + { + // rightHandSide is the right hand side of the equation. + vec<4, T, Q> RightHandSide; + RightHandSide[0] = LocalMatrix[0][3]; + RightHandSide[1] = LocalMatrix[1][3]; + RightHandSide[2] = LocalMatrix[2][3]; + RightHandSide[3] = LocalMatrix[3][3]; + + // Solve the equation by inverting PerspectiveMatrix and multiplying + // rightHandSide by the inverse. (This is the easiest way, not + // necessarily the best.) + mat<4, 4, T, Q> InversePerspectiveMatrix = glm::inverse(PerspectiveMatrix);// inverse(PerspectiveMatrix, inversePerspectiveMatrix); + mat<4, 4, T, Q> TransposedInversePerspectiveMatrix = glm::transpose(InversePerspectiveMatrix);// transposeMatrix4(inversePerspectiveMatrix, transposedInversePerspectiveMatrix); + + Perspective = TransposedInversePerspectiveMatrix * RightHandSide; + // v4MulPointByMatrix(rightHandSide, transposedInversePerspectiveMatrix, perspectivePoint); + + // Clear the perspective partition + LocalMatrix[0][3] = LocalMatrix[1][3] = LocalMatrix[2][3] = static_cast(0); + LocalMatrix[3][3] = static_cast(1); + } + else + { + // No perspective. + Perspective = vec<4, T, Q>(0, 0, 0, 1); + } + + // Next take care of translation (easy). + Translation = vec<3, T, Q>(LocalMatrix[3]); + LocalMatrix[3] = vec<4, T, Q>(0, 0, 0, LocalMatrix[3].w); + + vec<3, T, Q> Row[3], Pdum3; + + // Now get scale and shear. + for(length_t i = 0; i < 3; ++i) + for(length_t j = 0; j < 3; ++j) + Row[i][j] = LocalMatrix[i][j]; + + // Compute X scale factor and normalize first row. + Scale.x = length(Row[0]);// v3Length(Row[0]); + + Row[0] = detail::scale(Row[0], static_cast(1)); + + // Compute XY shear factor and make 2nd row orthogonal to 1st. + Skew.z = dot(Row[0], Row[1]); + Row[1] = detail::combine(Row[1], Row[0], static_cast(1), -Skew.z); + + // Now, compute Y scale and normalize 2nd row. + Scale.y = length(Row[1]); + Row[1] = detail::scale(Row[1], static_cast(1)); + Skew.z /= Scale.y; + + // Compute XZ and YZ shears, orthogonalize 3rd row. + Skew.y = glm::dot(Row[0], Row[2]); + Row[2] = detail::combine(Row[2], Row[0], static_cast(1), -Skew.y); + Skew.x = glm::dot(Row[1], Row[2]); + Row[2] = detail::combine(Row[2], Row[1], static_cast(1), -Skew.x); + + // Next, get Z scale and normalize 3rd row. + Scale.z = length(Row[2]); + Row[2] = detail::scale(Row[2], static_cast(1)); + Skew.y /= Scale.z; + Skew.x /= Scale.z; + + // At this point, the matrix (in rows[]) is orthonormal. + // Check for a coordinate system flip. If the determinant + // is -1, then negate the matrix and the scaling factors. + Pdum3 = cross(Row[1], Row[2]); // v3Cross(row[1], row[2], Pdum3); + if(dot(Row[0], Pdum3) < 0) + { + for(length_t i = 0; i < 3; i++) + { + Scale[i] *= static_cast(-1); + Row[i] *= static_cast(-1); + } + } + + // Now, get the rotations out, as described in the gem. + + // FIXME - Add the ability to return either quaternions (which are + // easier to recompose with) or Euler angles (rx, ry, rz), which + // are easier for authors to deal with. The latter will only be useful + // when we fix https://bugs.webkit.org/show_bug.cgi?id=23799, so I + // will leave the Euler angle code here for now. + + // ret.rotateY = asin(-Row[0][2]); + // if (cos(ret.rotateY) != 0) { + // ret.rotateX = atan2(Row[1][2], Row[2][2]); + // ret.rotateZ = atan2(Row[0][1], Row[0][0]); + // } else { + // ret.rotateX = atan2(-Row[2][0], Row[1][1]); + // ret.rotateZ = 0; + // } + + int i, j, k = 0; + T root, trace = Row[0].x + Row[1].y + Row[2].z; + if(trace > static_cast(0)) + { + root = sqrt(trace + static_cast(1.0)); + Orientation.w = static_cast(0.5) * root; + root = static_cast(0.5) / root; + Orientation.x = root * (Row[1].z - Row[2].y); + Orientation.y = root * (Row[2].x - Row[0].z); + Orientation.z = root * (Row[0].y - Row[1].x); + } // End if > 0 + else + { + static int Next[3] = {1, 2, 0}; + i = 0; + if(Row[1].y > Row[0].x) i = 1; + if(Row[2].z > Row[i][i]) i = 2; + j = Next[i]; + k = Next[j]; + + root = sqrt(Row[i][i] - Row[j][j] - Row[k][k] + static_cast(1.0)); + + Orientation[i] = static_cast(0.5) * root; + root = static_cast(0.5) / root; + Orientation[j] = root * (Row[i][j] + Row[j][i]); + Orientation[k] = root * (Row[i][k] + Row[k][i]); + Orientation.w = root * (Row[j][k] - Row[k][j]); + } // End if <= 0 + + return true; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/matrix_factorisation.hpp b/NothinFancy/dep/include/glm/gtx/matrix_factorisation.hpp new file mode 100644 index 0000000..5a975d6 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_factorisation.hpp @@ -0,0 +1,69 @@ +/// @ref gtx_matrix_factorisation +/// @file glm/gtx/matrix_factorisation.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_factorisation GLM_GTX_matrix_factorisation +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Functions to factor matrices in various forms + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_factorisation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_factorisation extension included") +# endif +#endif + +/* +Suggestions: + - Move helper functions flipud and fliplr to another file: They may be helpful in more general circumstances. + - Implement other types of matrix factorisation, such as: QL and LQ, L(D)U, eigendecompositions, etc... +*/ + +namespace glm +{ + /// @addtogroup gtx_matrix_factorisation + /// @{ + + /// Flips the matrix rows up and down. + /// + /// From GLM_GTX_matrix_factorisation extension. + template + GLM_FUNC_DECL mat flipud(mat const& in); + + /// Flips the matrix columns right and left. + /// + /// From GLM_GTX_matrix_factorisation extension. + template + GLM_FUNC_DECL mat fliplr(mat const& in); + + /// Performs QR factorisation of a matrix. + /// Returns 2 matrices, q and r, such that the columns of q are orthonormal and span the same subspace than those of the input matrix, r is an upper triangular matrix, and q*r=in. + /// Given an n-by-m input matrix, q has dimensions min(n,m)-by-m, and r has dimensions n-by-min(n,m). + /// + /// From GLM_GTX_matrix_factorisation extension. + template + GLM_FUNC_DECL void qr_decompose(mat const& in, mat<(C < R ? C : R), R, T, Q>& q, mat& r); + + /// Performs RQ factorisation of a matrix. + /// Returns 2 matrices, r and q, such that r is an upper triangular matrix, the rows of q are orthonormal and span the same subspace than those of the input matrix, and r*q=in. + /// Note that in the context of RQ factorisation, the diagonal is seen as starting in the lower-right corner of the matrix, instead of the usual upper-left. + /// Given an n-by-m input matrix, r has dimensions min(n,m)-by-m, and q has dimensions n-by-min(n,m). + /// + /// From GLM_GTX_matrix_factorisation extension. + template + GLM_FUNC_DECL void rq_decompose(mat const& in, mat<(C < R ? C : R), R, T, Q>& r, mat& q); + + /// @} +} + +#include "matrix_factorisation.inl" diff --git a/NothinFancy/dep/include/glm/gtx/matrix_factorisation.inl b/NothinFancy/dep/include/glm/gtx/matrix_factorisation.inl new file mode 100644 index 0000000..c479b8a --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_factorisation.inl @@ -0,0 +1,84 @@ +/// @ref gtx_matrix_factorisation + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat flipud(mat const& in) + { + mat tin = transpose(in); + tin = fliplr(tin); + mat out = transpose(tin); + + return out; + } + + template + GLM_FUNC_QUALIFIER mat fliplr(mat const& in) + { + mat out; + for (length_t i = 0; i < C; i++) + { + out[i] = in[(C - i) - 1]; + } + + return out; + } + + template + GLM_FUNC_QUALIFIER void qr_decompose(mat const& in, mat<(C < R ? C : R), R, T, Q>& q, mat& r) + { + // Uses modified Gram-Schmidt method + // Source: https://en.wikipedia.org/wiki/Gram–Schmidt_process + // And https://en.wikipedia.org/wiki/QR_decomposition + + //For all the linearly independs columns of the input... + // (there can be no more linearly independents columns than there are rows.) + for (length_t i = 0; i < (C < R ? C : R); i++) + { + //Copy in Q the input's i-th column. + q[i] = in[i]; + + //j = [0,i[ + // Make that column orthogonal to all the previous ones by substracting to it the non-orthogonal projection of all the previous columns. + // Also: Fill the zero elements of R + for (length_t j = 0; j < i; j++) + { + q[i] -= dot(q[i], q[j])*q[j]; + r[j][i] = 0; + } + + //Now, Q i-th column is orthogonal to all the previous columns. Normalize it. + q[i] = normalize(q[i]); + + //j = [i,C[ + //Finally, compute the corresponding coefficients of R by computing the projection of the resulting column on the other columns of the input. + for (length_t j = i; j < C; j++) + { + r[j][i] = dot(in[j], q[i]); + } + } + } + + template + GLM_FUNC_QUALIFIER void rq_decompose(mat const& in, mat<(C < R ? C : R), R, T, Q>& r, mat& q) + { + // From https://en.wikipedia.org/wiki/QR_decomposition: + // The RQ decomposition transforms a matrix A into the product of an upper triangular matrix R (also known as right-triangular) and an orthogonal matrix Q. The only difference from QR decomposition is the order of these matrices. + // QR decomposition is Gram–Schmidt orthogonalization of columns of A, started from the first column. + // RQ decomposition is Gram–Schmidt orthogonalization of rows of A, started from the last row. + + mat tin = transpose(in); + tin = fliplr(tin); + + mat tr; + mat<(C < R ? C : R), C, T, Q> tq; + qr_decompose(tin, tq, tr); + + tr = fliplr(tr); + r = transpose(tr); + r = fliplr(r); + + tq = fliplr(tq); + q = transpose(tq); + } +} //namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/matrix_interpolation.hpp b/NothinFancy/dep/include/glm/gtx/matrix_interpolation.hpp new file mode 100644 index 0000000..7d5ad4c --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_interpolation.hpp @@ -0,0 +1,60 @@ +/// @ref gtx_matrix_interpolation +/// @file glm/gtx/matrix_interpolation.hpp +/// @author Ghenadii Ursachi (the.asteroth@gmail.com) +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_interpolation GLM_GTX_matrix_interpolation +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Allows to directly interpolate two matrices. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_interpolation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_interpolation extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_interpolation + /// @{ + + /// Get the axis and angle of the rotation from a matrix. + /// From GLM_GTX_matrix_interpolation extension. + template + GLM_FUNC_DECL void axisAngle( + mat<4, 4, T, Q> const& Mat, vec<3, T, Q> & Axis, T & Angle); + + /// Build a matrix from axis and angle. + /// From GLM_GTX_matrix_interpolation extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> axisAngleMatrix( + vec<3, T, Q> const& Axis, T const Angle); + + /// Extracts the rotation part of a matrix. + /// From GLM_GTX_matrix_interpolation extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> extractMatrixRotation( + mat<4, 4, T, Q> const& Mat); + + /// Build a interpolation of 4 * 4 matrixes. + /// From GLM_GTX_matrix_interpolation extension. + /// Warning! works only with rotation and/or translation matrixes, scale will generate unexpected results. + template + GLM_FUNC_DECL mat<4, 4, T, Q> interpolate( + mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2, T const Delta); + + /// @} +}//namespace glm + +#include "matrix_interpolation.inl" diff --git a/NothinFancy/dep/include/glm/gtx/matrix_interpolation.inl b/NothinFancy/dep/include/glm/gtx/matrix_interpolation.inl new file mode 100644 index 0000000..de40b7d --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_interpolation.inl @@ -0,0 +1,129 @@ +/// @ref gtx_matrix_interpolation + +#include "../gtc/constants.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER void axisAngle(mat<4, 4, T, Q> const& m, vec<3, T, Q> & axis, T& angle) + { + T epsilon = static_cast(0.01); + T epsilon2 = static_cast(0.1); + + if((abs(m[1][0] - m[0][1]) < epsilon) && (abs(m[2][0] - m[0][2]) < epsilon) && (abs(m[2][1] - m[1][2]) < epsilon)) + { + if ((abs(m[1][0] + m[0][1]) < epsilon2) && (abs(m[2][0] + m[0][2]) < epsilon2) && (abs(m[2][1] + m[1][2]) < epsilon2) && (abs(m[0][0] + m[1][1] + m[2][2] - static_cast(3.0)) < epsilon2)) + { + angle = static_cast(0.0); + axis.x = static_cast(1.0); + axis.y = static_cast(0.0); + axis.z = static_cast(0.0); + return; + } + angle = static_cast(3.1415926535897932384626433832795); + T xx = (m[0][0] + static_cast(1.0)) * static_cast(0.5); + T yy = (m[1][1] + static_cast(1.0)) * static_cast(0.5); + T zz = (m[2][2] + static_cast(1.0)) * static_cast(0.5); + T xy = (m[1][0] + m[0][1]) * static_cast(0.25); + T xz = (m[2][0] + m[0][2]) * static_cast(0.25); + T yz = (m[2][1] + m[1][2]) * static_cast(0.25); + if((xx > yy) && (xx > zz)) + { + if(xx < epsilon) + { + axis.x = static_cast(0.0); + axis.y = static_cast(0.7071); + axis.z = static_cast(0.7071); + } + else + { + axis.x = sqrt(xx); + axis.y = xy / axis.x; + axis.z = xz / axis.x; + } + } + else if (yy > zz) + { + if(yy < epsilon) + { + axis.x = static_cast(0.7071); + axis.y = static_cast(0.0); + axis.z = static_cast(0.7071); + } + else + { + axis.y = sqrt(yy); + axis.x = xy / axis.y; + axis.z = yz / axis.y; + } + } + else + { + if (zz < epsilon) + { + axis.x = static_cast(0.7071); + axis.y = static_cast(0.7071); + axis.z = static_cast(0.0); + } + else + { + axis.z = sqrt(zz); + axis.x = xz / axis.z; + axis.y = yz / axis.z; + } + } + return; + } + T s = sqrt((m[2][1] - m[1][2]) * (m[2][1] - m[1][2]) + (m[2][0] - m[0][2]) * (m[2][0] - m[0][2]) + (m[1][0] - m[0][1]) * (m[1][0] - m[0][1])); + if (glm::abs(s) < T(0.001)) + s = static_cast(1); + T const angleCos = (m[0][0] + m[1][1] + m[2][2] - static_cast(1)) * static_cast(0.5); + if(angleCos - static_cast(1) < epsilon) + angle = pi() * static_cast(0.25); + else + angle = acos(angleCos); + axis.x = (m[1][2] - m[2][1]) / s; + axis.y = (m[2][0] - m[0][2]) / s; + axis.z = (m[0][1] - m[1][0]) / s; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> axisAngleMatrix(vec<3, T, Q> const& axis, T const angle) + { + T c = cos(angle); + T s = sin(angle); + T t = static_cast(1) - c; + vec<3, T, Q> n = normalize(axis); + + return mat<4, 4, T, Q>( + t * n.x * n.x + c, t * n.x * n.y + n.z * s, t * n.x * n.z - n.y * s, static_cast(0.0), + t * n.x * n.y - n.z * s, t * n.y * n.y + c, t * n.y * n.z + n.x * s, static_cast(0.0), + t * n.x * n.z + n.y * s, t * n.y * n.z - n.x * s, t * n.z * n.z + c, static_cast(0.0), + static_cast(0.0), static_cast(0.0), static_cast(0.0), static_cast(1.0)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> extractMatrixRotation(mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + m[0][0], m[0][1], m[0][2], static_cast(0.0), + m[1][0], m[1][1], m[1][2], static_cast(0.0), + m[2][0], m[2][1], m[2][2], static_cast(0.0), + static_cast(0.0), static_cast(0.0), static_cast(0.0), static_cast(1.0)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> interpolate(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2, T const delta) + { + mat<4, 4, T, Q> m1rot = extractMatrixRotation(m1); + mat<4, 4, T, Q> dltRotation = m2 * transpose(m1rot); + vec<3, T, Q> dltAxis; + T dltAngle; + axisAngle(dltRotation, dltAxis, dltAngle); + mat<4, 4, T, Q> out = axisAngleMatrix(dltAxis, dltAngle * delta) * m1rot; + out[3][0] = m1[3][0] + delta * (m2[3][0] - m1[3][0]); + out[3][1] = m1[3][1] + delta * (m2[3][1] - m1[3][1]); + out[3][2] = m1[3][2] + delta * (m2[3][2] - m1[3][2]); + return out; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/matrix_major_storage.hpp b/NothinFancy/dep/include/glm/gtx/matrix_major_storage.hpp new file mode 100644 index 0000000..8c6bc22 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_major_storage.hpp @@ -0,0 +1,119 @@ +/// @ref gtx_matrix_major_storage +/// @file glm/gtx/matrix_major_storage.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_matrix_major_storage GLM_GTX_matrix_major_storage +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Build matrices with specific matrix order, row or column + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_major_storage is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_major_storage extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_major_storage + /// @{ + + //! Build a row major matrix from row vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> rowMajor2( + vec<2, T, Q> const& v1, + vec<2, T, Q> const& v2); + + //! Build a row major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> rowMajor2( + mat<2, 2, T, Q> const& m); + + //! Build a row major matrix from row vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> rowMajor3( + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3); + + //! Build a row major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> rowMajor3( + mat<3, 3, T, Q> const& m); + + //! Build a row major matrix from row vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> rowMajor4( + vec<4, T, Q> const& v1, + vec<4, T, Q> const& v2, + vec<4, T, Q> const& v3, + vec<4, T, Q> const& v4); + + //! Build a row major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> rowMajor4( + mat<4, 4, T, Q> const& m); + + //! Build a column major matrix from column vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> colMajor2( + vec<2, T, Q> const& v1, + vec<2, T, Q> const& v2); + + //! Build a column major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> colMajor2( + mat<2, 2, T, Q> const& m); + + //! Build a column major matrix from column vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> colMajor3( + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3); + + //! Build a column major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> colMajor3( + mat<3, 3, T, Q> const& m); + + //! Build a column major matrix from column vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> colMajor4( + vec<4, T, Q> const& v1, + vec<4, T, Q> const& v2, + vec<4, T, Q> const& v3, + vec<4, T, Q> const& v4); + + //! Build a column major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> colMajor4( + mat<4, 4, T, Q> const& m); + + /// @} +}//namespace glm + +#include "matrix_major_storage.inl" diff --git a/NothinFancy/dep/include/glm/gtx/matrix_major_storage.inl b/NothinFancy/dep/include/glm/gtx/matrix_major_storage.inl new file mode 100644 index 0000000..279dd34 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_major_storage.inl @@ -0,0 +1,166 @@ +/// @ref gtx_matrix_major_storage + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> rowMajor2 + ( + vec<2, T, Q> const& v1, + vec<2, T, Q> const& v2 + ) + { + mat<2, 2, T, Q> Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> rowMajor2( + const mat<2, 2, T, Q>& m) + { + mat<2, 2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rowMajor3( + const vec<3, T, Q>& v1, + const vec<3, T, Q>& v2, + const vec<3, T, Q>& v3) + { + mat<3, 3, T, Q> Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[2][0] = v1.z; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + Result[2][1] = v2.z; + Result[0][2] = v3.x; + Result[1][2] = v3.y; + Result[2][2] = v3.z; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rowMajor3( + const mat<3, 3, T, Q>& m) + { + mat<3, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rowMajor4( + const vec<4, T, Q>& v1, + const vec<4, T, Q>& v2, + const vec<4, T, Q>& v3, + const vec<4, T, Q>& v4) + { + mat<4, 4, T, Q> Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[2][0] = v1.z; + Result[3][0] = v1.w; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + Result[2][1] = v2.z; + Result[3][1] = v2.w; + Result[0][2] = v3.x; + Result[1][2] = v3.y; + Result[2][2] = v3.z; + Result[3][2] = v3.w; + Result[0][3] = v4.x; + Result[1][3] = v4.y; + Result[2][3] = v4.z; + Result[3][3] = v4.w; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rowMajor4( + const mat<4, 4, T, Q>& m) + { + mat<4, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[2][3] = m[3][2]; + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + Result[3][2] = m[2][3]; + Result[3][3] = m[3][3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> colMajor2( + const vec<2, T, Q>& v1, + const vec<2, T, Q>& v2) + { + return mat<2, 2, T, Q>(v1, v2); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> colMajor2( + const mat<2, 2, T, Q>& m) + { + return mat<2, 2, T, Q>(m); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> colMajor3( + const vec<3, T, Q>& v1, + const vec<3, T, Q>& v2, + const vec<3, T, Q>& v3) + { + return mat<3, 3, T, Q>(v1, v2, v3); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> colMajor3( + const mat<3, 3, T, Q>& m) + { + return mat<3, 3, T, Q>(m); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> colMajor4( + const vec<4, T, Q>& v1, + const vec<4, T, Q>& v2, + const vec<4, T, Q>& v3, + const vec<4, T, Q>& v4) + { + return mat<4, 4, T, Q>(v1, v2, v3, v4); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> colMajor4( + const mat<4, 4, T, Q>& m) + { + return mat<4, 4, T, Q>(m); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/matrix_operation.hpp b/NothinFancy/dep/include/glm/gtx/matrix_operation.hpp new file mode 100644 index 0000000..de6ff1f --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_operation.hpp @@ -0,0 +1,103 @@ +/// @ref gtx_matrix_operation +/// @file glm/gtx/matrix_operation.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_operation GLM_GTX_matrix_operation +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Build diagonal matrices from vectors. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_operation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_operation extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_operation + /// @{ + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> diagonal2x2( + vec<2, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<2, 3, T, Q> diagonal2x3( + vec<2, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<2, 4, T, Q> diagonal2x4( + vec<2, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<3, 2, T, Q> diagonal3x2( + vec<2, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> diagonal3x3( + vec<3, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<3, 4, T, Q> diagonal3x4( + vec<3, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<4, 2, T, Q> diagonal4x2( + vec<2, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<4, 3, T, Q> diagonal4x3( + vec<3, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> diagonal4x4( + vec<4, T, Q> const& v); + + /// Build an adjugate matrix. + /// From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> adjugate(mat<2, 2, T, Q> const& m); + + /// Build an adjugate matrix. + /// From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> adjugate(mat<3, 3, T, Q> const& m); + + /// Build an adjugate matrix. + /// From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> adjugate(mat<4, 4, T, Q> const& m); + + /// @} +}//namespace glm + +#include "matrix_operation.inl" diff --git a/NothinFancy/dep/include/glm/gtx/matrix_operation.inl b/NothinFancy/dep/include/glm/gtx/matrix_operation.inl new file mode 100644 index 0000000..9de83f8 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_operation.inl @@ -0,0 +1,176 @@ +/// @ref gtx_matrix_operation + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> diagonal2x2 + ( + vec<2, T, Q> const& v + ) + { + mat<2, 2, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> diagonal2x3 + ( + vec<2, T, Q> const& v + ) + { + mat<2, 3, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> diagonal2x4 + ( + vec<2, T, Q> const& v + ) + { + mat<2, 4, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> diagonal3x2 + ( + vec<2, T, Q> const& v + ) + { + mat<3, 2, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> diagonal3x3 + ( + vec<3, T, Q> const& v + ) + { + mat<3, 3, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> diagonal3x4 + ( + vec<3, T, Q> const& v + ) + { + mat<3, 4, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> diagonal4x4 + ( + vec<4, T, Q> const& v + ) + { + mat<4, 4, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + Result[3][3] = v[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> diagonal4x3 + ( + vec<3, T, Q> const& v + ) + { + mat<4, 3, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> diagonal4x2 + ( + vec<2, T, Q> const& v + ) + { + mat<4, 2, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> adjugate(mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + +m[1][1], -m[1][0], + -m[0][1], +m[0][0]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> adjugate(mat<3, 3, T, Q> const& m) + { + T const m00 = determinant(mat<2, 2, T, Q>(m[1][1], m[2][1], m[1][2], m[2][2])); + T const m01 = determinant(mat<2, 2, T, Q>(m[0][1], m[2][1], m[0][2], m[2][2])); + T const m02 = determinant(mat<2, 2, T, Q>(m[0][1], m[1][1], m[0][2], m[1][2])); + + T const m10 = determinant(mat<2, 2, T, Q>(m[1][0], m[2][0], m[1][2], m[2][2])); + T const m11 = determinant(mat<2, 2, T, Q>(m[0][0], m[2][0], m[0][2], m[2][2])); + T const m12 = determinant(mat<2, 2, T, Q>(m[0][0], m[1][0], m[0][2], m[1][2])); + + T const m20 = determinant(mat<2, 2, T, Q>(m[1][0], m[2][0], m[1][1], m[2][1])); + T const m21 = determinant(mat<2, 2, T, Q>(m[0][0], m[2][0], m[0][1], m[2][1])); + T const m22 = determinant(mat<2, 2, T, Q>(m[0][0], m[1][0], m[0][1], m[1][1])); + + return mat<3, 3, T, Q>( + +m00, -m01, +m02, + -m10, +m11, -m12, + +m20, -m21, +m22); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> adjugate(mat<4, 4, T, Q> const& m) + { + T const m00 = determinant(mat<3, 3, T, Q>(m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], m[3][3])); + T const m01 = determinant(mat<3, 3, T, Q>(m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], m[3][3])); + T const m02 = determinant(mat<3, 3, T, Q>(m[1][0], m[1][1], m[1][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][1], m[3][3])); + T const m03 = determinant(mat<3, 3, T, Q>(m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], m[3][2])); + + T const m10 = determinant(mat<3, 3, T, Q>(m[0][1], m[0][2], m[0][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], m[3][3])); + T const m11 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][2], m[0][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], m[3][3])); + T const m12 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][3], m[2][0], m[2][1], m[2][3], m[3][0], m[3][1], m[3][3])); + T const m13 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], m[3][2])); + + T const m20 = determinant(mat<3, 3, T, Q>(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[3][1], m[3][2], m[3][3])); + T const m21 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[3][0], m[3][2], m[3][3])); + T const m22 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[3][0], m[3][1], m[3][3])); + T const m23 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[3][0], m[3][1], m[3][2])); + + T const m30 = determinant(mat<3, 3, T, Q>(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], m[2][3])); + T const m31 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], m[2][3])); + T const m32 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[2][0], m[2][1], m[2][3])); + T const m33 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2])); + + return mat<4, 4, T, Q>( + +m00, -m01, +m02, -m03, + -m10, +m11, -m12, +m13, + +m20, -m21, +m22, -m23, + -m30, +m31, -m32, +m33); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/matrix_query.hpp b/NothinFancy/dep/include/glm/gtx/matrix_query.hpp new file mode 100644 index 0000000..8011b2b --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_query.hpp @@ -0,0 +1,77 @@ +/// @ref gtx_matrix_query +/// @file glm/gtx/matrix_query.hpp +/// +/// @see core (dependence) +/// @see gtx_vector_query (dependence) +/// +/// @defgroup gtx_matrix_query GLM_GTX_matrix_query +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Query to evaluate matrix properties + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/vector_query.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_query extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_query + /// @{ + + /// Return whether a matrix a null matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNull(mat<2, 2, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix a null matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNull(mat<3, 3, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix is a null matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNull(mat<4, 4, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix is an identity matrix. + /// From GLM_GTX_matrix_query extension. + template class matType> + GLM_FUNC_DECL bool isIdentity(matType const& m, T const& epsilon); + + /// Return whether a matrix is a normalized matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNormalized(mat<2, 2, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix is a normalized matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNormalized(mat<3, 3, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix is a normalized matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNormalized(mat<4, 4, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix is an orthonormalized matrix. + /// From GLM_GTX_matrix_query extension. + template class matType> + GLM_FUNC_DECL bool isOrthogonal(matType const& m, T const& epsilon); + + /// @} +}//namespace glm + +#include "matrix_query.inl" diff --git a/NothinFancy/dep/include/glm/gtx/matrix_query.inl b/NothinFancy/dep/include/glm/gtx/matrix_query.inl new file mode 100644 index 0000000..77bd231 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_query.inl @@ -0,0 +1,113 @@ +/// @ref gtx_matrix_query + +namespace glm +{ + template + GLM_FUNC_QUALIFIER bool isNull(mat<2, 2, T, Q> const& m, T const& epsilon) + { + bool result = true; + for(length_t i = 0; result && i < m.length() ; ++i) + result = isNull(m[i], epsilon); + return result; + } + + template + GLM_FUNC_QUALIFIER bool isNull(mat<3, 3, T, Q> const& m, T const& epsilon) + { + bool result = true; + for(length_t i = 0; result && i < m.length() ; ++i) + result = isNull(m[i], epsilon); + return result; + } + + template + GLM_FUNC_QUALIFIER bool isNull(mat<4, 4, T, Q> const& m, T const& epsilon) + { + bool result = true; + for(length_t i = 0; result && i < m.length() ; ++i) + result = isNull(m[i], epsilon); + return result; + } + + template + GLM_FUNC_QUALIFIER bool isIdentity(mat const& m, T const& epsilon) + { + bool result = true; + for(length_t i = 0; result && i < m[0].length() ; ++i) + { + for(length_t j = 0; result && j < i ; ++j) + result = abs(m[i][j]) <= epsilon; + if(result) + result = abs(m[i][i] - 1) <= epsilon; + for(length_t j = i + 1; result && j < m.length(); ++j) + result = abs(m[i][j]) <= epsilon; + } + return result; + } + + template + GLM_FUNC_QUALIFIER bool isNormalized(mat<2, 2, T, Q> const& m, T const& epsilon) + { + bool result(true); + for(length_t i = 0; result && i < m.length(); ++i) + result = isNormalized(m[i], epsilon); + for(length_t i = 0; result && i < m.length(); ++i) + { + typename mat<2, 2, T, Q>::col_type v; + for(length_t j = 0; j < m.length(); ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; + } + + template + GLM_FUNC_QUALIFIER bool isNormalized(mat<3, 3, T, Q> const& m, T const& epsilon) + { + bool result(true); + for(length_t i = 0; result && i < m.length(); ++i) + result = isNormalized(m[i], epsilon); + for(length_t i = 0; result && i < m.length(); ++i) + { + typename mat<3, 3, T, Q>::col_type v; + for(length_t j = 0; j < m.length(); ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; + } + + template + GLM_FUNC_QUALIFIER bool isNormalized(mat<4, 4, T, Q> const& m, T const& epsilon) + { + bool result(true); + for(length_t i = 0; result && i < m.length(); ++i) + result = isNormalized(m[i], epsilon); + for(length_t i = 0; result && i < m.length(); ++i) + { + typename mat<4, 4, T, Q>::col_type v; + for(length_t j = 0; j < m.length(); ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; + } + + template + GLM_FUNC_QUALIFIER bool isOrthogonal(mat const& m, T const& epsilon) + { + bool result = true; + for(length_t i(0); result && i < m.length() - 1; ++i) + for(length_t j(i + 1); result && j < m.length(); ++j) + result = areOrthogonal(m[i], m[j], epsilon); + + if(result) + { + mat tmp = transpose(m); + for(length_t i(0); result && i < m.length() - 1 ; ++i) + for(length_t j(i + 1); result && j < m.length(); ++j) + result = areOrthogonal(tmp[i], tmp[j], epsilon); + } + return result; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/matrix_transform_2d.hpp b/NothinFancy/dep/include/glm/gtx/matrix_transform_2d.hpp new file mode 100644 index 0000000..5f9c540 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_transform_2d.hpp @@ -0,0 +1,81 @@ +/// @ref gtx_matrix_transform_2d +/// @file glm/gtx/matrix_transform_2d.hpp +/// @author Miguel Ángel Pérez Martínez +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_transform_2d GLM_GTX_matrix_transform_2d +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defines functions that generate common 2d transformation matrices. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" +#include "../vec2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_transform_2d is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_transform_2d extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_transform_2d + /// @{ + + /// Builds a translation 3 * 3 matrix created from a vector of 2 components. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param v Coordinates of a translation vector. + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v); + + /// Builds a rotation 3 * 3 matrix created from an angle. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param angle Rotation angle expressed in radians. + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate( + mat<3, 3, T, Q> const& m, + T angle); + + /// Builds a scale 3 * 3 matrix created from a vector of 2 components. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param v Coordinates of a scale vector. + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v); + + /// Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param y Shear factor. + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX( + mat<3, 3, T, Q> const& m, + T y); + + /// Builds a vertical (parallel to the y axis) shear 3 * 3 matrix. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param x Shear factor. + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY( + mat<3, 3, T, Q> const& m, + T x); + + /// @} +}//namespace glm + +#include "matrix_transform_2d.inl" diff --git a/NothinFancy/dep/include/glm/gtx/matrix_transform_2d.inl b/NothinFancy/dep/include/glm/gtx/matrix_transform_2d.inl new file mode 100644 index 0000000..a68d24d --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/matrix_transform_2d.inl @@ -0,0 +1,68 @@ +/// @ref gtx_matrix_transform_2d +/// @author Miguel Ángel Pérez Martínez + +#include "../trigonometric.hpp" + +namespace glm +{ + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v) + { + mat<3, 3, T, Q> Result(m); + Result[2] = m[0] * v[0] + m[1] * v[1] + m[2]; + return Result; + } + + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate( + mat<3, 3, T, Q> const& m, + T angle) + { + T const a = angle; + T const c = cos(a); + T const s = sin(a); + + mat<3, 3, T, Q> Result; + Result[0] = m[0] * c + m[1] * s; + Result[1] = m[0] * -s + m[1] * c; + Result[2] = m[2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v) + { + mat<3, 3, T, Q> Result; + Result[0] = m[0] * v[0]; + Result[1] = m[1] * v[1]; + Result[2] = m[2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX( + mat<3, 3, T, Q> const& m, + T y) + { + mat<3, 3, T, Q> Result(1); + Result[0][1] = y; + return m * Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY( + mat<3, 3, T, Q> const& m, + T x) + { + mat<3, 3, T, Q> Result(1); + Result[1][0] = x; + return m * Result; + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/mixed_product.hpp b/NothinFancy/dep/include/glm/gtx/mixed_product.hpp new file mode 100644 index 0000000..b242e35 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/mixed_product.hpp @@ -0,0 +1,41 @@ +/// @ref gtx_mixed_product +/// @file glm/gtx/mixed_product.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_mixed_product GLM_GTX_mixed_producte +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Mixed product of 3 vectors. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_mixed_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_mixed_product extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_mixed_product + /// @{ + + /// @brief Mixed product of 3 vectors (from GLM_GTX_mixed_product extension) + template + GLM_FUNC_DECL T mixedProduct( + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3); + + /// @} +}// namespace glm + +#include "mixed_product.inl" diff --git a/NothinFancy/dep/include/glm/gtx/mixed_product.inl b/NothinFancy/dep/include/glm/gtx/mixed_product.inl new file mode 100644 index 0000000..e5cdbdb --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/mixed_product.inl @@ -0,0 +1,15 @@ +/// @ref gtx_mixed_product + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T mixedProduct + ( + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3 + ) + { + return dot(cross(v1, v2), v3); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/norm.hpp b/NothinFancy/dep/include/glm/gtx/norm.hpp new file mode 100644 index 0000000..dfaebb7 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/norm.hpp @@ -0,0 +1,88 @@ +/// @ref gtx_norm +/// @file glm/gtx/norm.hpp +/// +/// @see core (dependence) +/// @see gtx_quaternion (dependence) +/// @see gtx_component_wise (dependence) +/// +/// @defgroup gtx_norm GLM_GTX_norm +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Various ways to compute vector norms. + +#pragma once + +// Dependency: +#include "../geometric.hpp" +#include "../gtx/quaternion.hpp" +#include "../gtx/component_wise.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_norm is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_norm extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_norm + /// @{ + + /// Returns the squared length of x. + /// From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T length2(vec const& x); + + /// Returns the squared distance between p0 and p1, i.e., length2(p0 - p1). + /// From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T distance2(vec const& p0, vec const& p1); + + //! Returns the L1 norm between x and y. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T l1Norm(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + //! Returns the L1 norm of v. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T l1Norm(vec<3, T, Q> const& v); + + //! Returns the L2 norm between x and y. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T l2Norm(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + //! Returns the L2 norm of v. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T l2Norm(vec<3, T, Q> const& x); + + //! Returns the L norm between x and y. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T lxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y, unsigned int Depth); + + //! Returns the L norm of v. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T lxNorm(vec<3, T, Q> const& x, unsigned int Depth); + + //! Returns the LMax norm between x and y. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T lMaxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + //! Returns the LMax norm of v. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T lMaxNorm(vec<3, T, Q> const& x); + + /// @} +}//namespace glm + +#include "norm.inl" diff --git a/NothinFancy/dep/include/glm/gtx/norm.inl b/NothinFancy/dep/include/glm/gtx/norm.inl new file mode 100644 index 0000000..6db561b --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/norm.inl @@ -0,0 +1,95 @@ +/// @ref gtx_norm + +#include "../detail/qualifier.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_length2 + { + GLM_FUNC_QUALIFIER static T call(vec const& v) + { + return dot(v, v); + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER genType length2(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'length2' accepts only floating-point inputs"); + return x * x; + } + + template + GLM_FUNC_QUALIFIER T length2(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'length2' accepts only floating-point inputs"); + return detail::compute_length2::value>::call(v); + } + + template + GLM_FUNC_QUALIFIER T distance2(T p0, T p1) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'distance2' accepts only floating-point inputs"); + return length2(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER T distance2(vec const& p0, vec const& p1) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'distance2' accepts only floating-point inputs"); + return length2(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER T l1Norm(vec<3, T, Q> const& a, vec<3, T, Q> const& b) + { + return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z); + } + + template + GLM_FUNC_QUALIFIER T l1Norm(vec<3, T, Q> const& v) + { + return abs(v.x) + abs(v.y) + abs(v.z); + } + + template + GLM_FUNC_QUALIFIER T l2Norm(vec<3, T, Q> const& a, vec<3, T, Q> const& b + ) + { + return length(b - a); + } + + template + GLM_FUNC_QUALIFIER T l2Norm(vec<3, T, Q> const& v) + { + return length(v); + } + + template + GLM_FUNC_QUALIFIER T lxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y, unsigned int Depth) + { + return pow(pow(abs(y.x - x.x), T(Depth)) + pow(abs(y.y - x.y), T(Depth)) + pow(abs(y.z - x.z), T(Depth)), T(1) / T(Depth)); + } + + template + GLM_FUNC_QUALIFIER T lxNorm(vec<3, T, Q> const& v, unsigned int Depth) + { + return pow(pow(abs(v.x), T(Depth)) + pow(abs(v.y), T(Depth)) + pow(abs(v.z), T(Depth)), T(1) / T(Depth)); + } + + template + GLM_FUNC_QUALIFIER T lMaxNorm(vec<3, T, Q> const& a, vec<3, T, Q> const& b) + { + return compMax(abs(b - a)); + } + + template + GLM_FUNC_QUALIFIER T lMaxNorm(vec<3, T, Q> const& v) + { + return compMax(abs(v)); + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/normal.hpp b/NothinFancy/dep/include/glm/gtx/normal.hpp new file mode 100644 index 0000000..068682f --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/normal.hpp @@ -0,0 +1,41 @@ +/// @ref gtx_normal +/// @file glm/gtx/normal.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_normal GLM_GTX_normal +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Compute the normal of a triangle. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_normal is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_normal extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_normal + /// @{ + + /// Computes triangle normal from triangle points. + /// + /// @see gtx_normal + template + GLM_FUNC_DECL vec<3, T, Q> triangleNormal(vec<3, T, Q> const& p1, vec<3, T, Q> const& p2, vec<3, T, Q> const& p3); + + /// @} +}//namespace glm + +#include "normal.inl" diff --git a/NothinFancy/dep/include/glm/gtx/normal.inl b/NothinFancy/dep/include/glm/gtx/normal.inl new file mode 100644 index 0000000..74f9fc9 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/normal.inl @@ -0,0 +1,15 @@ +/// @ref gtx_normal + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> triangleNormal + ( + vec<3, T, Q> const& p1, + vec<3, T, Q> const& p2, + vec<3, T, Q> const& p3 + ) + { + return normalize(cross(p1 - p2, p1 - p3)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/normalize_dot.hpp b/NothinFancy/dep/include/glm/gtx/normalize_dot.hpp new file mode 100644 index 0000000..5195802 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/normalize_dot.hpp @@ -0,0 +1,49 @@ +/// @ref gtx_normalize_dot +/// @file glm/gtx/normalize_dot.hpp +/// +/// @see core (dependence) +/// @see gtx_fast_square_root (dependence) +/// +/// @defgroup gtx_normalize_dot GLM_GTX_normalize_dot +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Dot product of vectors that need to be normalize with a single square root. + +#pragma once + +// Dependency: +#include "../gtx/fast_square_root.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_normalize_dot is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_normalize_dot extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_normalize_dot + /// @{ + + /// Normalize parameters and returns the dot product of x and y. + /// It's faster that dot(normalize(x), normalize(y)). + /// + /// @see gtx_normalize_dot extension. + template + GLM_FUNC_DECL T normalizeDot(vec const& x, vec const& y); + + /// Normalize parameters and returns the dot product of x and y. + /// Faster that dot(fastNormalize(x), fastNormalize(y)). + /// + /// @see gtx_normalize_dot extension. + template + GLM_FUNC_DECL T fastNormalizeDot(vec const& x, vec const& y); + + /// @} +}//namespace glm + +#include "normalize_dot.inl" diff --git a/NothinFancy/dep/include/glm/gtx/normalize_dot.inl b/NothinFancy/dep/include/glm/gtx/normalize_dot.inl new file mode 100644 index 0000000..7bcd9a5 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/normalize_dot.inl @@ -0,0 +1,16 @@ +/// @ref gtx_normalize_dot + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T normalizeDot(vec const& x, vec const& y) + { + return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); + } + + template + GLM_FUNC_QUALIFIER T fastNormalizeDot(vec const& x, vec const& y) + { + return glm::dot(x, y) * glm::fastInverseSqrt(glm::dot(x, x) * glm::dot(y, y)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/number_precision.hpp b/NothinFancy/dep/include/glm/gtx/number_precision.hpp new file mode 100644 index 0000000..3a606bd --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/number_precision.hpp @@ -0,0 +1,61 @@ +/// @ref gtx_number_precision +/// @file glm/gtx/number_precision.hpp +/// +/// @see core (dependence) +/// @see gtc_type_precision (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_number_precision GLM_GTX_number_precision +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defined size types. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/type_precision.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_number_precision is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_number_precision extension included") +# endif +#endif + +namespace glm{ +namespace gtx +{ + ///////////////////////////// + // Unsigned int vector types + + /// @addtogroup gtx_number_precision + /// @{ + + typedef u8 u8vec1; //!< \brief 8bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + typedef u16 u16vec1; //!< \brief 16bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + typedef u32 u32vec1; //!< \brief 32bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + typedef u64 u64vec1; //!< \brief 64bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + + ////////////////////// + // Float vector types + + typedef f32 f32vec1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64vec1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + + ////////////////////// + // Float matrix types + + typedef f32 f32mat1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f32 f32mat1x1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64mat1; //!< \brief Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64mat1x1; //!< \brief Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + + /// @} +}//namespace gtx +}//namespace glm + +#include "number_precision.inl" diff --git a/NothinFancy/dep/include/glm/gtx/number_precision.inl b/NothinFancy/dep/include/glm/gtx/number_precision.inl new file mode 100644 index 0000000..b39d71c --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/number_precision.inl @@ -0,0 +1,6 @@ +/// @ref gtx_number_precision + +namespace glm +{ + +} diff --git a/NothinFancy/dep/include/glm/gtx/optimum_pow.hpp b/NothinFancy/dep/include/glm/gtx/optimum_pow.hpp new file mode 100644 index 0000000..9284a47 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/optimum_pow.hpp @@ -0,0 +1,54 @@ +/// @ref gtx_optimum_pow +/// @file glm/gtx/optimum_pow.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_optimum_pow GLM_GTX_optimum_pow +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Integer exponentiation of power functions. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_optimum_pow is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_optimum_pow extension included") +# endif +#endif + +namespace glm{ +namespace gtx +{ + /// @addtogroup gtx_optimum_pow + /// @{ + + /// Returns x raised to the power of 2. + /// + /// @see gtx_optimum_pow + template + GLM_FUNC_DECL genType pow2(genType const& x); + + /// Returns x raised to the power of 3. + /// + /// @see gtx_optimum_pow + template + GLM_FUNC_DECL genType pow3(genType const& x); + + /// Returns x raised to the power of 4. + /// + /// @see gtx_optimum_pow + template + GLM_FUNC_DECL genType pow4(genType const& x); + + /// @} +}//namespace gtx +}//namespace glm + +#include "optimum_pow.inl" diff --git a/NothinFancy/dep/include/glm/gtx/optimum_pow.inl b/NothinFancy/dep/include/glm/gtx/optimum_pow.inl new file mode 100644 index 0000000..a26c19c --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/optimum_pow.inl @@ -0,0 +1,22 @@ +/// @ref gtx_optimum_pow + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType pow2(genType const& x) + { + return x * x; + } + + template + GLM_FUNC_QUALIFIER genType pow3(genType const& x) + { + return x * x * x; + } + + template + GLM_FUNC_QUALIFIER genType pow4(genType const& x) + { + return (x * x) * (x * x); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/orthonormalize.hpp b/NothinFancy/dep/include/glm/gtx/orthonormalize.hpp new file mode 100644 index 0000000..3e004fb --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/orthonormalize.hpp @@ -0,0 +1,49 @@ +/// @ref gtx_orthonormalize +/// @file glm/gtx/orthonormalize.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_orthonormalize GLM_GTX_orthonormalize +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Orthonormalize matrices. + +#pragma once + +// Dependency: +#include "../vec3.hpp" +#include "../mat3x3.hpp" +#include "../geometric.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_orthonormalize is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_orthonormalize extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_orthonormalize + /// @{ + + /// Returns the orthonormalized matrix of m. + /// + /// @see gtx_orthonormalize + template + GLM_FUNC_DECL mat<3, 3, T, Q> orthonormalize(mat<3, 3, T, Q> const& m); + + /// Orthonormalizes x according y. + /// + /// @see gtx_orthonormalize + template + GLM_FUNC_DECL vec<3, T, Q> orthonormalize(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + /// @} +}//namespace glm + +#include "orthonormalize.inl" diff --git a/NothinFancy/dep/include/glm/gtx/orthonormalize.inl b/NothinFancy/dep/include/glm/gtx/orthonormalize.inl new file mode 100644 index 0000000..cb553ba --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/orthonormalize.inl @@ -0,0 +1,29 @@ +/// @ref gtx_orthonormalize + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> orthonormalize(mat<3, 3, T, Q> const& m) + { + mat<3, 3, T, Q> r = m; + + r[0] = normalize(r[0]); + + T d0 = dot(r[0], r[1]); + r[1] -= r[0] * d0; + r[1] = normalize(r[1]); + + T d1 = dot(r[1], r[2]); + d0 = dot(r[0], r[2]); + r[2] -= r[0] * d0 + r[1] * d1; + r[2] = normalize(r[2]); + + return r; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> orthonormalize(vec<3, T, Q> const& x, vec<3, T, Q> const& y) + { + return normalize(x - y * dot(y, x)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/perpendicular.hpp b/NothinFancy/dep/include/glm/gtx/perpendicular.hpp new file mode 100644 index 0000000..72b77b6 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/perpendicular.hpp @@ -0,0 +1,41 @@ +/// @ref gtx_perpendicular +/// @file glm/gtx/perpendicular.hpp +/// +/// @see core (dependence) +/// @see gtx_projection (dependence) +/// +/// @defgroup gtx_perpendicular GLM_GTX_perpendicular +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Perpendicular of a vector from other one + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/projection.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_perpendicular is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_perpendicular extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_perpendicular + /// @{ + + //! Projects x a perpendicular axis of Normal. + //! From GLM_GTX_perpendicular extension. + template + GLM_FUNC_DECL genType perp(genType const& x, genType const& Normal); + + /// @} +}//namespace glm + +#include "perpendicular.inl" diff --git a/NothinFancy/dep/include/glm/gtx/perpendicular.inl b/NothinFancy/dep/include/glm/gtx/perpendicular.inl new file mode 100644 index 0000000..1e72f33 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/perpendicular.inl @@ -0,0 +1,10 @@ +/// @ref gtx_perpendicular + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType perp(genType const& x, genType const& Normal) + { + return x - proj(x, Normal); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/polar_coordinates.hpp b/NothinFancy/dep/include/glm/gtx/polar_coordinates.hpp new file mode 100644 index 0000000..76beb82 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/polar_coordinates.hpp @@ -0,0 +1,48 @@ +/// @ref gtx_polar_coordinates +/// @file glm/gtx/polar_coordinates.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_polar_coordinates GLM_GTX_polar_coordinates +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Conversion from Euclidean space to polar space and revert. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_polar_coordinates is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_polar_coordinates extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_polar_coordinates + /// @{ + + /// Convert Euclidean to Polar coordinates, x is the latitude, y the longitude and z the xz distance. + /// + /// @see gtx_polar_coordinates + template + GLM_FUNC_DECL vec<3, T, Q> polar( + vec<3, T, Q> const& euclidean); + + /// Convert Polar to Euclidean coordinates. + /// + /// @see gtx_polar_coordinates + template + GLM_FUNC_DECL vec<3, T, Q> euclidean( + vec<2, T, Q> const& polar); + + /// @} +}//namespace glm + +#include "polar_coordinates.inl" diff --git a/NothinFancy/dep/include/glm/gtx/polar_coordinates.inl b/NothinFancy/dep/include/glm/gtx/polar_coordinates.inl new file mode 100644 index 0000000..371c8dd --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/polar_coordinates.inl @@ -0,0 +1,36 @@ +/// @ref gtx_polar_coordinates + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> polar + ( + vec<3, T, Q> const& euclidean + ) + { + T const Length(length(euclidean)); + vec<3, T, Q> const tmp(euclidean / Length); + T const xz_dist(sqrt(tmp.x * tmp.x + tmp.z * tmp.z)); + + return vec<3, T, Q>( + asin(tmp.y), // latitude + atan(tmp.x, tmp.z), // longitude + xz_dist); // xz distance + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> euclidean + ( + vec<2, T, Q> const& polar + ) + { + T const latitude(polar.x); + T const longitude(polar.y); + + return vec<3, T, Q>( + cos(latitude) * sin(longitude), + sin(latitude), + cos(latitude) * cos(longitude)); + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/projection.hpp b/NothinFancy/dep/include/glm/gtx/projection.hpp new file mode 100644 index 0000000..678f3ad --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/projection.hpp @@ -0,0 +1,43 @@ +/// @ref gtx_projection +/// @file glm/gtx/projection.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_projection GLM_GTX_projection +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Projection of a vector to other one + +#pragma once + +// Dependency: +#include "../geometric.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_projection is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_projection extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_projection + /// @{ + + /// Projects x on Normal. + /// + /// @param[in] x A vector to project + /// @param[in] Normal A normal that doesn't need to be of unit length. + /// + /// @see gtx_projection + template + GLM_FUNC_DECL genType proj(genType const& x, genType const& Normal); + + /// @} +}//namespace glm + +#include "projection.inl" diff --git a/NothinFancy/dep/include/glm/gtx/projection.inl b/NothinFancy/dep/include/glm/gtx/projection.inl new file mode 100644 index 0000000..f23f884 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/projection.inl @@ -0,0 +1,10 @@ +/// @ref gtx_projection + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType proj(genType const& x, genType const& Normal) + { + return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/quaternion.hpp b/NothinFancy/dep/include/glm/gtx/quaternion.hpp new file mode 100644 index 0000000..5c2b5ad --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/quaternion.hpp @@ -0,0 +1,174 @@ +/// @ref gtx_quaternion +/// @file glm/gtx/quaternion.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_quaternion GLM_GTX_quaternion +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Extented quaternion types and functions + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/constants.hpp" +#include "../gtc/quaternion.hpp" +#include "../ext/quaternion_exponential.hpp" +#include "../gtx/norm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_quaternion extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_quaternion + /// @{ + + /// Create an identity quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL GLM_CONSTEXPR qua quat_identity(); + + /// Compute a cross product between a quaternion and a vector. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL vec<3, T, Q> cross( + qua const& q, + vec<3, T, Q> const& v); + + //! Compute a cross product between a vector and a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL vec<3, T, Q> cross( + vec<3, T, Q> const& v, + qua const& q); + + //! Compute a point on a path according squad equation. + //! q1 and q2 are control points; s1 and s2 are intermediate control points. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua squad( + qua const& q1, + qua const& q2, + qua const& s1, + qua const& s2, + T const& h); + + //! Returns an intermediate control point for squad interpolation. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua intermediate( + qua const& prev, + qua const& curr, + qua const& next); + + //! Returns quarternion square root. + /// + /// @see gtx_quaternion + //template + //qua sqrt( + // qua const& q); + + //! Rotates a 3 components vector by a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL vec<3, T, Q> rotate( + qua const& q, + vec<3, T, Q> const& v); + + /// Rotates a 4 components vector by a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL vec<4, T, Q> rotate( + qua const& q, + vec<4, T, Q> const& v); + + /// Extract the real component of a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL T extractRealComponent( + qua const& q); + + /// Converts a quaternion to a 3 * 3 matrix. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL mat<3, 3, T, Q> toMat3( + qua const& x){return mat3_cast(x);} + + /// Converts a quaternion to a 4 * 4 matrix. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL mat<4, 4, T, Q> toMat4( + qua const& x){return mat4_cast(x);} + + /// Converts a 3 * 3 matrix to a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua toQuat( + mat<3, 3, T, Q> const& x){return quat_cast(x);} + + /// Converts a 4 * 4 matrix to a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua toQuat( + mat<4, 4, T, Q> const& x){return quat_cast(x);} + + /// Quaternion interpolation using the rotation short path. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua shortMix( + qua const& x, + qua const& y, + T const& a); + + /// Quaternion normalized linear interpolation. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua fastMix( + qua const& x, + qua const& y, + T const& a); + + /// Compute the rotation between two vectors. + /// @param orig vector, needs to be normalized + /// @param dest vector, needs to be normalized + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua rotation( + vec<3, T, Q> const& orig, + vec<3, T, Q> const& dest); + + /// Returns the squared length of x. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL GLM_CONSTEXPR T length2(qua const& q); + + /// @} +}//namespace glm + +#include "quaternion.inl" diff --git a/NothinFancy/dep/include/glm/gtx/quaternion.inl b/NothinFancy/dep/include/glm/gtx/quaternion.inl new file mode 100644 index 0000000..d125bcc --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/quaternion.inl @@ -0,0 +1,159 @@ +/// @ref gtx_quaternion + +#include +#include "../gtc/constants.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua quat_identity() + { + return qua(static_cast(1), static_cast(0), static_cast(0), static_cast(0)); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> cross(vec<3, T, Q> const& v, qua const& q) + { + return inverse(q) * v; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> cross(qua const& q, vec<3, T, Q> const& v) + { + return q * v; + } + + template + GLM_FUNC_QUALIFIER qua squad + ( + qua const& q1, + qua const& q2, + qua const& s1, + qua const& s2, + T const& h) + { + return mix(mix(q1, q2, h), mix(s1, s2, h), static_cast(2) * (static_cast(1) - h) * h); + } + + template + GLM_FUNC_QUALIFIER qua intermediate + ( + qua const& prev, + qua const& curr, + qua const& next + ) + { + qua invQuat = inverse(curr); + return exp((log(next * invQuat) + log(prev * invQuat)) / static_cast(-4)) * curr; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotate(qua const& q, vec<3, T, Q> const& v) + { + return q * v; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> rotate(qua const& q, vec<4, T, Q> const& v) + { + return q * v; + } + + template + GLM_FUNC_QUALIFIER T extractRealComponent(qua const& q) + { + T w = static_cast(1) - q.x * q.x - q.y * q.y - q.z * q.z; + if(w < T(0)) + return T(0); + else + return -sqrt(w); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T length2(qua const& q) + { + return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w; + } + + template + GLM_FUNC_QUALIFIER qua shortMix(qua const& x, qua const& y, T const& a) + { + if(a <= static_cast(0)) return x; + if(a >= static_cast(1)) return y; + + T fCos = dot(x, y); + qua y2(y); //BUG!!! qua y2; + if(fCos < static_cast(0)) + { + y2 = -y; + fCos = -fCos; + } + + //if(fCos > 1.0f) // problem + T k0, k1; + if(fCos > (static_cast(1) - epsilon())) + { + k0 = static_cast(1) - a; + k1 = static_cast(0) + a; //BUG!!! 1.0f + a; + } + else + { + T fSin = sqrt(T(1) - fCos * fCos); + T fAngle = atan(fSin, fCos); + T fOneOverSin = static_cast(1) / fSin; + k0 = sin((static_cast(1) - a) * fAngle) * fOneOverSin; + k1 = sin((static_cast(0) + a) * fAngle) * fOneOverSin; + } + + return qua( + k0 * x.w + k1 * y2.w, + k0 * x.x + k1 * y2.x, + k0 * x.y + k1 * y2.y, + k0 * x.z + k1 * y2.z); + } + + template + GLM_FUNC_QUALIFIER qua fastMix(qua const& x, qua const& y, T const& a) + { + return glm::normalize(x * (static_cast(1) - a) + (y * a)); + } + + template + GLM_FUNC_QUALIFIER qua rotation(vec<3, T, Q> const& orig, vec<3, T, Q> const& dest) + { + T cosTheta = dot(orig, dest); + vec<3, T, Q> rotationAxis; + + if(cosTheta >= static_cast(1) - epsilon()) { + // orig and dest point in the same direction + return quat_identity(); + } + + if(cosTheta < static_cast(-1) + epsilon()) + { + // special case when vectors in opposite directions : + // there is no "ideal" rotation axis + // So guess one; any will do as long as it's perpendicular to start + // This implementation favors a rotation around the Up axis (Y), + // since it's often what you want to do. + rotationAxis = cross(vec<3, T, Q>(0, 0, 1), orig); + if(length2(rotationAxis) < epsilon()) // bad luck, they were parallel, try again! + rotationAxis = cross(vec<3, T, Q>(1, 0, 0), orig); + + rotationAxis = normalize(rotationAxis); + return angleAxis(pi(), rotationAxis); + } + + // Implementation from Stan Melax's Game Programming Gems 1 article + rotationAxis = cross(orig, dest); + + T s = sqrt((T(1) + cosTheta) * static_cast(2)); + T invs = static_cast(1) / s; + + return qua( + s * static_cast(0.5f), + rotationAxis.x * invs, + rotationAxis.y * invs, + rotationAxis.z * invs); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/range.hpp b/NothinFancy/dep/include/glm/gtx/range.hpp new file mode 100644 index 0000000..93bcb9a --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/range.hpp @@ -0,0 +1,98 @@ +/// @ref gtx_range +/// @file glm/gtx/range.hpp +/// @author Joshua Moerman +/// +/// @defgroup gtx_range GLM_GTX_range +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defines begin and end for vectors and matrices. Useful for range-based for loop. +/// The range is defined over the elements, not over columns or rows (e.g. mat4 has 16 elements). + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_range is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_range extension included") +# endif +#endif + +#include "../gtc/type_ptr.hpp" +#include "../gtc/vec1.hpp" + +namespace glm +{ + /// @addtogroup gtx_range + /// @{ + +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable : 4100) // unreferenced formal parameter +# endif + + template + inline length_t components(vec<1, T, Q> const& v) + { + return v.length(); + } + + template + inline length_t components(vec<2, T, Q> const& v) + { + return v.length(); + } + + template + inline length_t components(vec<3, T, Q> const& v) + { + return v.length(); + } + + template + inline length_t components(vec<4, T, Q> const& v) + { + return v.length(); + } + + template + inline length_t components(genType const& m) + { + return m.length() * m[0].length(); + } + + template + inline typename genType::value_type const * begin(genType const& v) + { + return value_ptr(v); + } + + template + inline typename genType::value_type const * end(genType const& v) + { + return begin(v) + components(v); + } + + template + inline typename genType::value_type * begin(genType& v) + { + return value_ptr(v); + } + + template + inline typename genType::value_type * end(genType& v) + { + return begin(v) + components(v); + } + +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif + + /// @} +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/raw_data.hpp b/NothinFancy/dep/include/glm/gtx/raw_data.hpp new file mode 100644 index 0000000..86cbe77 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/raw_data.hpp @@ -0,0 +1,51 @@ +/// @ref gtx_raw_data +/// @file glm/gtx/raw_data.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_raw_data GLM_GTX_raw_data +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Projection of a vector to other one + +#pragma once + +// Dependencies +#include "../ext/scalar_uint_sized.hpp" +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_raw_data is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_raw_data extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_raw_data + /// @{ + + //! Type for byte numbers. + //! From GLM_GTX_raw_data extension. + typedef detail::uint8 byte; + + //! Type for word numbers. + //! From GLM_GTX_raw_data extension. + typedef detail::uint16 word; + + //! Type for dword numbers. + //! From GLM_GTX_raw_data extension. + typedef detail::uint32 dword; + + //! Type for qword numbers. + //! From GLM_GTX_raw_data extension. + typedef detail::uint64 qword; + + /// @} +}// namespace glm + +#include "raw_data.inl" diff --git a/NothinFancy/dep/include/glm/gtx/raw_data.inl b/NothinFancy/dep/include/glm/gtx/raw_data.inl new file mode 100644 index 0000000..c740317 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/raw_data.inl @@ -0,0 +1,2 @@ +/// @ref gtx_raw_data + diff --git a/NothinFancy/dep/include/glm/gtx/rotate_normalized_axis.hpp b/NothinFancy/dep/include/glm/gtx/rotate_normalized_axis.hpp new file mode 100644 index 0000000..2103ca0 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/rotate_normalized_axis.hpp @@ -0,0 +1,68 @@ +/// @ref gtx_rotate_normalized_axis +/// @file glm/gtx/rotate_normalized_axis.hpp +/// +/// @see core (dependence) +/// @see gtc_matrix_transform +/// @see gtc_quaternion +/// +/// @defgroup gtx_rotate_normalized_axis GLM_GTX_rotate_normalized_axis +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Quaternions and matrices rotations around normalized axis. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/epsilon.hpp" +#include "../gtc/quaternion.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_rotate_normalized_axis is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_rotate_normalized_axis extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_rotate_normalized_axis + /// @{ + + /// Builds a rotation 4 * 4 matrix created from a normalized axis and an angle. + /// + /// @param m Input matrix multiplied by this rotation matrix. + /// @param angle Rotation angle expressed in radians. + /// @param axis Rotation axis, must be normalized. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// + /// @see gtx_rotate_normalized_axis + /// @see - rotate(T angle, T x, T y, T z) + /// @see - rotate(mat<4, 4, T, Q> const& m, T angle, T x, T y, T z) + /// @see - rotate(T angle, vec<3, T, Q> const& v) + template + GLM_FUNC_DECL mat<4, 4, T, Q> rotateNormalizedAxis( + mat<4, 4, T, Q> const& m, + T const& angle, + vec<3, T, Q> const& axis); + + /// Rotates a quaternion from a vector of 3 components normalized axis and an angle. + /// + /// @param q Source orientation + /// @param angle Angle expressed in radians. + /// @param axis Normalized axis of the rotation, must be normalized. + /// + /// @see gtx_rotate_normalized_axis + template + GLM_FUNC_DECL qua rotateNormalizedAxis( + qua const& q, + T const& angle, + vec<3, T, Q> const& axis); + + /// @} +}//namespace glm + +#include "rotate_normalized_axis.inl" diff --git a/NothinFancy/dep/include/glm/gtx/rotate_normalized_axis.inl b/NothinFancy/dep/include/glm/gtx/rotate_normalized_axis.inl new file mode 100644 index 0000000..b2e9278 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/rotate_normalized_axis.inl @@ -0,0 +1,58 @@ +/// @ref gtx_rotate_normalized_axis + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotateNormalizedAxis + ( + mat<4, 4, T, Q> const& m, + T const& angle, + vec<3, T, Q> const& v + ) + { + T const a = angle; + T const c = cos(a); + T const s = sin(a); + + vec<3, T, Q> const axis(v); + + vec<3, T, Q> const temp((static_cast(1) - c) * axis); + + mat<4, 4, T, Q> Rotate; + Rotate[0][0] = c + temp[0] * axis[0]; + Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2]; + Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1]; + + Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2]; + Rotate[1][1] = c + temp[1] * axis[1]; + Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0]; + + Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1]; + Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0]; + Rotate[2][2] = c + temp[2] * axis[2]; + + mat<4, 4, T, Q> Result; + Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; + Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; + Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; + Result[3] = m[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER qua rotateNormalizedAxis + ( + qua const& q, + T const& angle, + vec<3, T, Q> const& v + ) + { + vec<3, T, Q> const Tmp(v); + + T const AngleRad(angle); + T const Sin = sin(AngleRad * T(0.5)); + + return q * qua(cos(AngleRad * static_cast(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin); + //return gtc::quaternion::cross(q, tquat(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/rotate_vector.hpp b/NothinFancy/dep/include/glm/gtx/rotate_vector.hpp new file mode 100644 index 0000000..dcd5b95 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/rotate_vector.hpp @@ -0,0 +1,123 @@ +/// @ref gtx_rotate_vector +/// @file glm/gtx/rotate_vector.hpp +/// +/// @see core (dependence) +/// @see gtx_transform (dependence) +/// +/// @defgroup gtx_rotate_vector GLM_GTX_rotate_vector +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Function to directly rotate a vector + +#pragma once + +// Dependency: +#include "../gtx/transform.hpp" +#include "../gtc/epsilon.hpp" +#include "../ext/vector_relational.hpp" +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_rotate_vector is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_rotate_vector extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_rotate_vector + /// @{ + + /// Returns Spherical interpolation between two vectors + /// + /// @param x A first vector + /// @param y A second vector + /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1]. + /// + /// @see gtx_rotate_vector + template + GLM_FUNC_DECL vec<3, T, Q> slerp( + vec<3, T, Q> const& x, + vec<3, T, Q> const& y, + T const& a); + + //! Rotate a two dimensional vector. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<2, T, Q> rotate( + vec<2, T, Q> const& v, + T const& angle); + + //! Rotate a three dimensional vector around an axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<3, T, Q> rotate( + vec<3, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal); + + //! Rotate a four dimensional vector around an axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<4, T, Q> rotate( + vec<4, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal); + + //! Rotate a three dimensional vector around the X axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<3, T, Q> rotateX( + vec<3, T, Q> const& v, + T const& angle); + + //! Rotate a three dimensional vector around the Y axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<3, T, Q> rotateY( + vec<3, T, Q> const& v, + T const& angle); + + //! Rotate a three dimensional vector around the Z axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<3, T, Q> rotateZ( + vec<3, T, Q> const& v, + T const& angle); + + //! Rotate a four dimensional vector around the X axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<4, T, Q> rotateX( + vec<4, T, Q> const& v, + T const& angle); + + //! Rotate a four dimensional vector around the Y axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<4, T, Q> rotateY( + vec<4, T, Q> const& v, + T const& angle); + + //! Rotate a four dimensional vector around the Z axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<4, T, Q> rotateZ( + vec<4, T, Q> const& v, + T const& angle); + + //! Build a rotation matrix from a normal and a up vector. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> orientation( + vec<3, T, Q> const& Normal, + vec<3, T, Q> const& Up); + + /// @} +}//namespace glm + +#include "rotate_vector.inl" diff --git a/NothinFancy/dep/include/glm/gtx/rotate_vector.inl b/NothinFancy/dep/include/glm/gtx/rotate_vector.inl new file mode 100644 index 0000000..f8136e7 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/rotate_vector.inl @@ -0,0 +1,187 @@ +/// @ref gtx_rotate_vector + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> slerp + ( + vec<3, T, Q> const& x, + vec<3, T, Q> const& y, + T const& a + ) + { + // get cosine of angle between vectors (-1 -> 1) + T CosAlpha = dot(x, y); + // get angle (0 -> pi) + T Alpha = acos(CosAlpha); + // get sine of angle between vectors (0 -> 1) + T SinAlpha = sin(Alpha); + // this breaks down when SinAlpha = 0, i.e. Alpha = 0 or pi + T t1 = sin((static_cast(1) - a) * Alpha) / SinAlpha; + T t2 = sin(a * Alpha) / SinAlpha; + + // interpolate src vectors + return x * t1 + y * t2; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> rotate + ( + vec<2, T, Q> const& v, + T const& angle + ) + { + vec<2, T, Q> Result; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotate + ( + vec<3, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal + ) + { + return mat<3, 3, T, Q>(glm::rotate(angle, normal)) * v; + } + /* + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateGTX( + const vec<3, T, Q>& x, + T angle, + const vec<3, T, Q>& normal) + { + const T Cos = cos(radians(angle)); + const T Sin = sin(radians(angle)); + return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin; + } + */ + template + GLM_FUNC_QUALIFIER vec<4, T, Q> rotate + ( + vec<4, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal + ) + { + return rotate(angle, normal) * v; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateX + ( + vec<3, T, Q> const& v, + T const& angle + ) + { + vec<3, T, Q> Result(v); + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.y = v.y * Cos - v.z * Sin; + Result.z = v.y * Sin + v.z * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateY + ( + vec<3, T, Q> const& v, + T const& angle + ) + { + vec<3, T, Q> Result = v; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.x = v.x * Cos + v.z * Sin; + Result.z = -v.x * Sin + v.z * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateZ + ( + vec<3, T, Q> const& v, + T const& angle + ) + { + vec<3, T, Q> Result = v; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> rotateX + ( + vec<4, T, Q> const& v, + T const& angle + ) + { + vec<4, T, Q> Result = v; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.y = v.y * Cos - v.z * Sin; + Result.z = v.y * Sin + v.z * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> rotateY + ( + vec<4, T, Q> const& v, + T const& angle + ) + { + vec<4, T, Q> Result = v; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.x = v.x * Cos + v.z * Sin; + Result.z = -v.x * Sin + v.z * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> rotateZ + ( + vec<4, T, Q> const& v, + T const& angle + ) + { + vec<4, T, Q> Result = v; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientation + ( + vec<3, T, Q> const& Normal, + vec<3, T, Q> const& Up + ) + { + if(all(equal(Normal, Up, epsilon()))) + return mat<4, 4, T, Q>(static_cast(1)); + + vec<3, T, Q> RotationAxis = cross(Up, Normal); + T Angle = acos(dot(Normal, Up)); + + return rotate(Angle, RotationAxis); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/scalar_multiplication.hpp b/NothinFancy/dep/include/glm/gtx/scalar_multiplication.hpp new file mode 100644 index 0000000..496ba19 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/scalar_multiplication.hpp @@ -0,0 +1,75 @@ +/// @ref gtx +/// @file glm/gtx/scalar_multiplication.hpp +/// @author Joshua Moerman +/// +/// Include to use the features of this extension. +/// +/// Enables scalar multiplication for all types +/// +/// Since GLSL is very strict about types, the following (often used) combinations do not work: +/// double * vec4 +/// int * vec4 +/// vec4 / int +/// So we'll fix that! Of course "float * vec4" should remain the same (hence the enable_if magic) + +#pragma once + +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_scalar_multiplication is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_scalar_multiplication extension included") +# endif +#endif + +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../mat2x2.hpp" +#include + +namespace glm +{ + template + using return_type_scalar_multiplication = typename std::enable_if< + !std::is_same::value // T may not be a float + && std::is_arithmetic::value, Vec // But it may be an int or double (no vec3 or mat3, ...) + >::type; + +#define GLM_IMPLEMENT_SCAL_MULT(Vec) \ + template \ + return_type_scalar_multiplication \ + operator*(T const& s, Vec rh){ \ + return rh *= static_cast(s); \ + } \ + \ + template \ + return_type_scalar_multiplication \ + operator*(Vec lh, T const& s){ \ + return lh *= static_cast(s); \ + } \ + \ + template \ + return_type_scalar_multiplication \ + operator/(Vec lh, T const& s){ \ + return lh *= 1.0f / static_cast(s); \ + } + +GLM_IMPLEMENT_SCAL_MULT(vec2) +GLM_IMPLEMENT_SCAL_MULT(vec3) +GLM_IMPLEMENT_SCAL_MULT(vec4) + +GLM_IMPLEMENT_SCAL_MULT(mat2) +GLM_IMPLEMENT_SCAL_MULT(mat2x3) +GLM_IMPLEMENT_SCAL_MULT(mat2x4) +GLM_IMPLEMENT_SCAL_MULT(mat3x2) +GLM_IMPLEMENT_SCAL_MULT(mat3) +GLM_IMPLEMENT_SCAL_MULT(mat3x4) +GLM_IMPLEMENT_SCAL_MULT(mat4x2) +GLM_IMPLEMENT_SCAL_MULT(mat4x3) +GLM_IMPLEMENT_SCAL_MULT(mat4) + +#undef GLM_IMPLEMENT_SCAL_MULT +} // namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/scalar_relational.hpp b/NothinFancy/dep/include/glm/gtx/scalar_relational.hpp new file mode 100644 index 0000000..8be9c57 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/scalar_relational.hpp @@ -0,0 +1,36 @@ +/// @ref gtx_scalar_relational +/// @file glm/gtx/scalar_relational.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_scalar_relational GLM_GTX_scalar_relational +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Extend a position from a source to a position at a defined length. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_extend extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_scalar_relational + /// @{ + + + + /// @} +}//namespace glm + +#include "scalar_relational.inl" diff --git a/NothinFancy/dep/include/glm/gtx/scalar_relational.inl b/NothinFancy/dep/include/glm/gtx/scalar_relational.inl new file mode 100644 index 0000000..c2a121c --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/scalar_relational.inl @@ -0,0 +1,88 @@ +/// @ref gtx_scalar_relational + +namespace glm +{ + template + GLM_FUNC_QUALIFIER bool lessThan + ( + T const& x, + T const& y + ) + { + return x < y; + } + + template + GLM_FUNC_QUALIFIER bool lessThanEqual + ( + T const& x, + T const& y + ) + { + return x <= y; + } + + template + GLM_FUNC_QUALIFIER bool greaterThan + ( + T const& x, + T const& y + ) + { + return x > y; + } + + template + GLM_FUNC_QUALIFIER bool greaterThanEqual + ( + T const& x, + T const& y + ) + { + return x >= y; + } + + template + GLM_FUNC_QUALIFIER bool equal + ( + T const& x, + T const& y + ) + { + return detail::compute_equal::is_iec559>::call(x, y); + } + + template + GLM_FUNC_QUALIFIER bool notEqual + ( + T const& x, + T const& y + ) + { + return !detail::compute_equal::is_iec559>::call(x, y); + } + + GLM_FUNC_QUALIFIER bool any + ( + bool const& x + ) + { + return x; + } + + GLM_FUNC_QUALIFIER bool all + ( + bool const& x + ) + { + return x; + } + + GLM_FUNC_QUALIFIER bool not_ + ( + bool const& x + ) + { + return !x; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/spline.hpp b/NothinFancy/dep/include/glm/gtx/spline.hpp new file mode 100644 index 0000000..731c979 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/spline.hpp @@ -0,0 +1,65 @@ +/// @ref gtx_spline +/// @file glm/gtx/spline.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_spline GLM_GTX_spline +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Spline functions + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/optimum_pow.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_spline is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_spline extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_spline + /// @{ + + /// Return a point from a catmull rom curve. + /// @see gtx_spline extension. + template + GLM_FUNC_DECL genType catmullRom( + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s); + + /// Return a point from a hermite curve. + /// @see gtx_spline extension. + template + GLM_FUNC_DECL genType hermite( + genType const& v1, + genType const& t1, + genType const& v2, + genType const& t2, + typename genType::value_type const& s); + + /// Return a point from a cubic curve. + /// @see gtx_spline extension. + template + GLM_FUNC_DECL genType cubic( + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s); + + /// @} +}//namespace glm + +#include "spline.inl" diff --git a/NothinFancy/dep/include/glm/gtx/spline.inl b/NothinFancy/dep/include/glm/gtx/spline.inl new file mode 100644 index 0000000..c3fd056 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/spline.inl @@ -0,0 +1,60 @@ +/// @ref gtx_spline + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType catmullRom + ( + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s + ) + { + typename genType::value_type s2 = pow2(s); + typename genType::value_type s3 = pow3(s); + + typename genType::value_type f1 = -s3 + typename genType::value_type(2) * s2 - s; + typename genType::value_type f2 = typename genType::value_type(3) * s3 - typename genType::value_type(5) * s2 + typename genType::value_type(2); + typename genType::value_type f3 = typename genType::value_type(-3) * s3 + typename genType::value_type(4) * s2 + s; + typename genType::value_type f4 = s3 - s2; + + return (f1 * v1 + f2 * v2 + f3 * v3 + f4 * v4) / typename genType::value_type(2); + + } + + template + GLM_FUNC_QUALIFIER genType hermite + ( + genType const& v1, + genType const& t1, + genType const& v2, + genType const& t2, + typename genType::value_type const& s + ) + { + typename genType::value_type s2 = pow2(s); + typename genType::value_type s3 = pow3(s); + + typename genType::value_type f1 = typename genType::value_type(2) * s3 - typename genType::value_type(3) * s2 + typename genType::value_type(1); + typename genType::value_type f2 = typename genType::value_type(-2) * s3 + typename genType::value_type(3) * s2; + typename genType::value_type f3 = s3 - typename genType::value_type(2) * s2 + s; + typename genType::value_type f4 = s3 - s2; + + return f1 * v1 + f2 * v2 + f3 * t1 + f4 * t2; + } + + template + GLM_FUNC_QUALIFIER genType cubic + ( + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s + ) + { + return ((v1 * s + v2) * s + v3) * s + v4; + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/std_based_type.hpp b/NothinFancy/dep/include/glm/gtx/std_based_type.hpp new file mode 100644 index 0000000..cd3be8c --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/std_based_type.hpp @@ -0,0 +1,68 @@ +/// @ref gtx_std_based_type +/// @file glm/gtx/std_based_type.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_std_based_type GLM_GTX_std_based_type +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Adds vector types based on STL value types. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_std_based_type is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_std_based_type extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_std_based_type + /// @{ + + /// Vector type based of one std::size_t component. + /// @see GLM_GTX_std_based_type + typedef vec<1, std::size_t, defaultp> size1; + + /// Vector type based of two std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<2, std::size_t, defaultp> size2; + + /// Vector type based of three std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<3, std::size_t, defaultp> size3; + + /// Vector type based of four std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<4, std::size_t, defaultp> size4; + + /// Vector type based of one std::size_t component. + /// @see GLM_GTX_std_based_type + typedef vec<1, std::size_t, defaultp> size1_t; + + /// Vector type based of two std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<2, std::size_t, defaultp> size2_t; + + /// Vector type based of three std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<3, std::size_t, defaultp> size3_t; + + /// Vector type based of four std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<4, std::size_t, defaultp> size4_t; + + /// @} +}//namespace glm + +#include "std_based_type.inl" diff --git a/NothinFancy/dep/include/glm/gtx/std_based_type.inl b/NothinFancy/dep/include/glm/gtx/std_based_type.inl new file mode 100644 index 0000000..9c34bdb --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/std_based_type.inl @@ -0,0 +1,6 @@ +/// @ref gtx_std_based_type + +namespace glm +{ + +} diff --git a/NothinFancy/dep/include/glm/gtx/string_cast.hpp b/NothinFancy/dep/include/glm/gtx/string_cast.hpp new file mode 100644 index 0000000..27846bf --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/string_cast.hpp @@ -0,0 +1,52 @@ +/// @ref gtx_string_cast +/// @file glm/gtx/string_cast.hpp +/// +/// @see core (dependence) +/// @see gtx_integer (dependence) +/// @see gtx_quaternion (dependence) +/// +/// @defgroup gtx_string_cast GLM_GTX_string_cast +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Setup strings for GLM type values +/// +/// This extension is not supported with CUDA + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/type_precision.hpp" +#include "../gtc/quaternion.hpp" +#include "../gtx/dual_quaternion.hpp" +#include +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_string_cast is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_string_cast extension included") +# endif +#endif + +#if(GLM_COMPILER & GLM_COMPILER_CUDA) +# error "GLM_GTX_string_cast is not supported on CUDA compiler" +#endif + +namespace glm +{ + /// @addtogroup gtx_string_cast + /// @{ + + /// Create a string from a GLM vector or matrix typed variable. + /// @see gtx_string_cast extension. + template + GLM_FUNC_DECL std::string to_string(genType const& x); + + /// @} +}//namespace glm + +#include "string_cast.inl" diff --git a/NothinFancy/dep/include/glm/gtx/string_cast.inl b/NothinFancy/dep/include/glm/gtx/string_cast.inl new file mode 100644 index 0000000..f67751d --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/string_cast.inl @@ -0,0 +1,492 @@ +/// @ref gtx_string_cast + +#include +#include + +namespace glm{ +namespace detail +{ + template + struct cast + { + typedef T value_type; + }; + + template <> + struct cast + { + typedef double value_type; + }; + + GLM_FUNC_QUALIFIER std::string format(const char* msg, ...) + { + std::size_t const STRING_BUFFER(4096); + char text[STRING_BUFFER]; + va_list list; + + if(msg == GLM_NULLPTR) + return std::string(); + + va_start(list, msg); +# if (GLM_COMPILER & GLM_COMPILER_VC) + vsprintf_s(text, STRING_BUFFER, msg, list); +# else// + std::vsprintf(text, msg, list); +# endif// + va_end(list); + + return std::string(text); + } + + static const char* LabelTrue = "true"; + static const char* LabelFalse = "false"; + + template + struct literal + { + GLM_FUNC_QUALIFIER static char const * value() {return "%d";} + }; + + template + struct literal + { + GLM_FUNC_QUALIFIER static char const * value() {return "%f";} + }; + +# if GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC + template<> + struct literal + { + GLM_FUNC_QUALIFIER static char const * value() {return "%lld";} + }; + + template<> + struct literal + { + GLM_FUNC_QUALIFIER static char const * value() {return "%lld";} + }; +# endif//GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC + + template + struct prefix{}; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "d";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "b";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "u8";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "i8";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "u16";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "i16";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "u";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "i";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "u64";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "i64";} + }; + + template + struct compute_to_string + {}; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<1, bool, Q> const& x) + { + return detail::format("bvec1(%s)", + x[0] ? detail::LabelTrue : detail::LabelFalse); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<2, bool, Q> const& x) + { + return detail::format("bvec2(%s, %s)", + x[0] ? detail::LabelTrue : detail::LabelFalse, + x[1] ? detail::LabelTrue : detail::LabelFalse); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<3, bool, Q> const& x) + { + return detail::format("bvec3(%s, %s, %s)", + x[0] ? detail::LabelTrue : detail::LabelFalse, + x[1] ? detail::LabelTrue : detail::LabelFalse, + x[2] ? detail::LabelTrue : detail::LabelFalse); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<4, bool, Q> const& x) + { + return detail::format("bvec4(%s, %s, %s, %s)", + x[0] ? detail::LabelTrue : detail::LabelFalse, + x[1] ? detail::LabelTrue : detail::LabelFalse, + x[2] ? detail::LabelTrue : detail::LabelFalse, + x[3] ? detail::LabelTrue : detail::LabelFalse); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<1, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%svec1(%s)", + PrefixStr, + LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<2, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%svec2(%s, %s)", + PrefixStr, + LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0]), + static_cast::value_type>(x[1])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<3, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%svec3(%s, %s, %s)", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0]), + static_cast::value_type>(x[1]), + static_cast::value_type>(x[2])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<4, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%svec4(%s, %s, %s, %s)", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0]), + static_cast::value_type>(x[1]), + static_cast::value_type>(x[2]), + static_cast::value_type>(x[3])); + } + }; + + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<2, 2, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat2x2((%s, %s), (%s, %s))", + PrefixStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<2, 3, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat2x3((%s, %s, %s), (%s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<2, 4, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat2x4((%s, %s, %s, %s), (%s, %s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), static_cast::value_type>(x[0][3]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2]), static_cast::value_type>(x[1][3])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<3, 2, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat3x2((%s, %s), (%s, %s), (%s, %s))", + PrefixStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<3, 3, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat3x3((%s, %s, %s), (%s, %s, %s), (%s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1]), static_cast::value_type>(x[2][2])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<3, 4, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat3x4((%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), static_cast::value_type>(x[0][3]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2]), static_cast::value_type>(x[1][3]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1]), static_cast::value_type>(x[2][2]), static_cast::value_type>(x[2][3])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<4, 2, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat4x2((%s, %s), (%s, %s), (%s, %s), (%s, %s))", + PrefixStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1]), + static_cast::value_type>(x[3][0]), static_cast::value_type>(x[3][1])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<4, 3, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat4x3((%s, %s, %s), (%s, %s, %s), (%s, %s, %s), (%s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1]), static_cast::value_type>(x[2][2]), + static_cast::value_type>(x[3][0]), static_cast::value_type>(x[3][1]), static_cast::value_type>(x[3][2])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<4, 4, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat4x4((%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), static_cast::value_type>(x[0][3]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2]), static_cast::value_type>(x[1][3]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1]), static_cast::value_type>(x[2][2]), static_cast::value_type>(x[2][3]), + static_cast::value_type>(x[3][0]), static_cast::value_type>(x[3][1]), static_cast::value_type>(x[3][2]), static_cast::value_type>(x[3][3])); + } + }; + + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(qua const& q) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%squat(%s, {%s, %s, %s})", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(q.w), + static_cast::value_type>(q.x), + static_cast::value_type>(q.y), + static_cast::value_type>(q.z)); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(tdualquat const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%sdualquat((%s, {%s, %s, %s}), (%s, {%s, %s, %s}))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x.real.w), + static_cast::value_type>(x.real.x), + static_cast::value_type>(x.real.y), + static_cast::value_type>(x.real.z), + static_cast::value_type>(x.dual.w), + static_cast::value_type>(x.dual.x), + static_cast::value_type>(x.dual.y), + static_cast::value_type>(x.dual.z)); + } + }; + +}//namespace detail + +template +GLM_FUNC_QUALIFIER std::string to_string(matType const& x) +{ + return detail::compute_to_string::call(x); +} + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/texture.hpp b/NothinFancy/dep/include/glm/gtx/texture.hpp new file mode 100644 index 0000000..20585e6 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/texture.hpp @@ -0,0 +1,46 @@ +/// @ref gtx_texture +/// @file glm/gtx/texture.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_texture GLM_GTX_texture +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Wrapping mode of texture coordinates. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/integer.hpp" +#include "../gtx/component_wise.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_texture is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_texture extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_texture + /// @{ + + /// Compute the number of mipmaps levels necessary to create a mipmap complete texture + /// + /// @param Extent Extent of the texture base level mipmap + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + template + T levels(vec const& Extent); + + /// @} +}// namespace glm + +#include "texture.inl" + diff --git a/NothinFancy/dep/include/glm/gtx/texture.inl b/NothinFancy/dep/include/glm/gtx/texture.inl new file mode 100644 index 0000000..593c826 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/texture.inl @@ -0,0 +1,17 @@ +/// @ref gtx_texture + +namespace glm +{ + template + inline T levels(vec const& Extent) + { + return glm::log2(compMax(Extent)) + static_cast(1); + } + + template + inline T levels(T Extent) + { + return vec<1, T, defaultp>(Extent).x; + } +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/gtx/transform.hpp b/NothinFancy/dep/include/glm/gtx/transform.hpp new file mode 100644 index 0000000..0279fc8 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/transform.hpp @@ -0,0 +1,60 @@ +/// @ref gtx_transform +/// @file glm/gtx/transform.hpp +/// +/// @see core (dependence) +/// @see gtc_matrix_transform (dependence) +/// @see gtx_transform +/// @see gtx_transform2 +/// +/// @defgroup gtx_transform GLM_GTX_transform +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Add transformation matrices + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/matrix_transform.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_transform is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_transform extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_transform + /// @{ + + /// Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars. + /// @see gtc_matrix_transform + /// @see gtx_transform + template + GLM_FUNC_DECL mat<4, 4, T, Q> translate( + vec<3, T, Q> const& v); + + /// Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in radians. + /// @see gtc_matrix_transform + /// @see gtx_transform + template + GLM_FUNC_DECL mat<4, 4, T, Q> rotate( + T angle, + vec<3, T, Q> const& v); + + /// Transforms a matrix with a scale 4 * 4 matrix created from a vector of 3 components. + /// @see gtc_matrix_transform + /// @see gtx_transform + template + GLM_FUNC_DECL mat<4, 4, T, Q> scale( + vec<3, T, Q> const& v); + + /// @} +}// namespace glm + +#include "transform.inl" diff --git a/NothinFancy/dep/include/glm/gtx/transform.inl b/NothinFancy/dep/include/glm/gtx/transform.inl new file mode 100644 index 0000000..48ee680 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/transform.inl @@ -0,0 +1,23 @@ +/// @ref gtx_transform + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(vec<3, T, Q> const& v) + { + return translate(mat<4, 4, T, Q>(static_cast(1)), v); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate(T angle, vec<3, T, Q> const& v) + { + return rotate(mat<4, 4, T, Q>(static_cast(1)), angle, v); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale(vec<3, T, Q> const& v) + { + return scale(mat<4, 4, T, Q>(static_cast(1)), v); + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/transform2.hpp b/NothinFancy/dep/include/glm/gtx/transform2.hpp new file mode 100644 index 0000000..0d8ba9d --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/transform2.hpp @@ -0,0 +1,89 @@ +/// @ref gtx_transform2 +/// @file glm/gtx/transform2.hpp +/// +/// @see core (dependence) +/// @see gtx_transform (dependence) +/// +/// @defgroup gtx_transform2 GLM_GTX_transform2 +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Add extra transformation matrices + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/transform.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_transform2 is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_transform2 extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_transform2 + /// @{ + + //! Transforms a matrix with a shearing on X axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> shearX2D(mat<3, 3, T, Q> const& m, T y); + + //! Transforms a matrix with a shearing on Y axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> shearY2D(mat<3, 3, T, Q> const& m, T x); + + //! Transforms a matrix with a shearing on X axis + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> shearX3D(mat<4, 4, T, Q> const& m, T y, T z); + + //! Transforms a matrix with a shearing on Y axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> shearY3D(mat<4, 4, T, Q> const& m, T x, T z); + + //! Transforms a matrix with a shearing on Z axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> shearZ3D(mat<4, 4, T, Q> const& m, T x, T y); + + //template GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shear(const mat<4, 4, T, Q> & m, shearPlane, planePoint, angle) + // Identity + tan(angle) * cross(Normal, OnPlaneVector) 0 + // - dot(PointOnPlane, normal) * OnPlaneVector 1 + + // Reflect functions seem to don't work + //template mat<3, 3, T, Q> reflect2D(const mat<3, 3, T, Q> & m, const vec<3, T, Q>& normal){return reflect2DGTX(m, normal);} //!< \brief Build a reflection matrix (from GLM_GTX_transform2 extension) + //template mat<4, 4, T, Q> reflect3D(const mat<4, 4, T, Q> & m, const vec<3, T, Q>& normal){return reflect3DGTX(m, normal);} //!< \brief Build a reflection matrix (from GLM_GTX_transform2 extension) + + //! Build planar projection matrix along normal axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> proj2D(mat<3, 3, T, Q> const& m, vec<3, T, Q> const& normal); + + //! Build planar projection matrix along normal axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> proj3D(mat<4, 4, T, Q> const & m, vec<3, T, Q> const& normal); + + //! Build a scale bias matrix. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> scaleBias(T scale, T bias); + + //! Build a scale bias matrix. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> scaleBias(mat<4, 4, T, Q> const& m, T scale, T bias); + + /// @} +}// namespace glm + +#include "transform2.inl" diff --git a/NothinFancy/dep/include/glm/gtx/transform2.inl b/NothinFancy/dep/include/glm/gtx/transform2.inl new file mode 100644 index 0000000..2b53198 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/transform2.inl @@ -0,0 +1,125 @@ +/// @ref gtx_transform2 + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX2D(mat<3, 3, T, Q> const& m, T s) + { + mat<3, 3, T, Q> r(1); + r[1][0] = s; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY2D(mat<3, 3, T, Q> const& m, T s) + { + mat<3, 3, T, Q> r(1); + r[0][1] = s; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearX3D(mat<4, 4, T, Q> const& m, T s, T t) + { + mat<4, 4, T, Q> r(1); + r[0][1] = s; + r[0][2] = t; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearY3D(mat<4, 4, T, Q> const& m, T s, T t) + { + mat<4, 4, T, Q> r(1); + r[1][0] = s; + r[1][2] = t; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearZ3D(mat<4, 4, T, Q> const& m, T s, T t) + { + mat<4, 4, T, Q> r(1); + r[2][0] = s; + r[2][1] = t; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> reflect2D(mat<3, 3, T, Q> const& m, vec<3, T, Q> const& normal) + { + mat<3, 3, T, Q> r(static_cast(1)); + r[0][0] = static_cast(1) - static_cast(2) * normal.x * normal.x; + r[0][1] = -static_cast(2) * normal.x * normal.y; + r[1][0] = -static_cast(2) * normal.x * normal.y; + r[1][1] = static_cast(1) - static_cast(2) * normal.y * normal.y; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> reflect3D(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& normal) + { + mat<4, 4, T, Q> r(static_cast(1)); + r[0][0] = static_cast(1) - static_cast(2) * normal.x * normal.x; + r[0][1] = -static_cast(2) * normal.x * normal.y; + r[0][2] = -static_cast(2) * normal.x * normal.z; + + r[1][0] = -static_cast(2) * normal.x * normal.y; + r[1][1] = static_cast(1) - static_cast(2) * normal.y * normal.y; + r[1][2] = -static_cast(2) * normal.y * normal.z; + + r[2][0] = -static_cast(2) * normal.x * normal.z; + r[2][1] = -static_cast(2) * normal.y * normal.z; + r[2][2] = static_cast(1) - static_cast(2) * normal.z * normal.z; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> proj2D( + const mat<3, 3, T, Q>& m, + const vec<3, T, Q>& normal) + { + mat<3, 3, T, Q> r(static_cast(1)); + r[0][0] = static_cast(1) - normal.x * normal.x; + r[0][1] = - normal.x * normal.y; + r[1][0] = - normal.x * normal.y; + r[1][1] = static_cast(1) - normal.y * normal.y; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> proj3D( + const mat<4, 4, T, Q>& m, + const vec<3, T, Q>& normal) + { + mat<4, 4, T, Q> r(static_cast(1)); + r[0][0] = static_cast(1) - normal.x * normal.x; + r[0][1] = - normal.x * normal.y; + r[0][2] = - normal.x * normal.z; + r[1][0] = - normal.x * normal.y; + r[1][1] = static_cast(1) - normal.y * normal.y; + r[1][2] = - normal.y * normal.z; + r[2][0] = - normal.x * normal.z; + r[2][1] = - normal.y * normal.z; + r[2][2] = static_cast(1) - normal.z * normal.z; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scaleBias(T scale, T bias) + { + mat<4, 4, T, Q> result; + result[3] = vec<4, T, Q>(vec<3, T, Q>(bias), static_cast(1)); + result[0][0] = scale; + result[1][1] = scale; + result[2][2] = scale; + return result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scaleBias(mat<4, 4, T, Q> const& m, T scale, T bias) + { + return m * scaleBias(scale, bias); + } +}//namespace glm + diff --git a/NothinFancy/dep/include/glm/gtx/type_aligned.hpp b/NothinFancy/dep/include/glm/gtx/type_aligned.hpp new file mode 100644 index 0000000..2ae522c --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/type_aligned.hpp @@ -0,0 +1,982 @@ +/// @ref gtx_type_aligned +/// @file glm/gtx/type_aligned.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_type_aligned GLM_GTX_type_aligned +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defines aligned types. + +#pragma once + +// Dependency: +#include "../gtc/type_precision.hpp" +#include "../gtc/quaternion.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_type_aligned is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_type_aligned extension included") +# endif +#endif + +namespace glm +{ + /////////////////////////// + // Signed int vector types + + /// @addtogroup gtx_type_aligned + /// @{ + + /// Low qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int8, aligned_lowp_int8, 1); + + /// Low qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int16, aligned_lowp_int16, 2); + + /// Low qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int32, aligned_lowp_int32, 4); + + /// Low qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int64, aligned_lowp_int64, 8); + + + /// Low qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int8_t, aligned_lowp_int8_t, 1); + + /// Low qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int16_t, aligned_lowp_int16_t, 2); + + /// Low qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int32_t, aligned_lowp_int32_t, 4); + + /// Low qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int64_t, aligned_lowp_int64_t, 8); + + + /// Low qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_i8, aligned_lowp_i8, 1); + + /// Low qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_i16, aligned_lowp_i16, 2); + + /// Low qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_i32, aligned_lowp_i32, 4); + + /// Low qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_i64, aligned_lowp_i64, 8); + + + /// Medium qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int8, aligned_mediump_int8, 1); + + /// Medium qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int16, aligned_mediump_int16, 2); + + /// Medium qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int32, aligned_mediump_int32, 4); + + /// Medium qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int64, aligned_mediump_int64, 8); + + + /// Medium qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int8_t, aligned_mediump_int8_t, 1); + + /// Medium qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int16_t, aligned_mediump_int16_t, 2); + + /// Medium qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int32_t, aligned_mediump_int32_t, 4); + + /// Medium qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int64_t, aligned_mediump_int64_t, 8); + + + /// Medium qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_i8, aligned_mediump_i8, 1); + + /// Medium qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_i16, aligned_mediump_i16, 2); + + /// Medium qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_i32, aligned_mediump_i32, 4); + + /// Medium qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_i64, aligned_mediump_i64, 8); + + + /// High qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int8, aligned_highp_int8, 1); + + /// High qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int16, aligned_highp_int16, 2); + + /// High qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int32, aligned_highp_int32, 4); + + /// High qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int64, aligned_highp_int64, 8); + + + /// High qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int8_t, aligned_highp_int8_t, 1); + + /// High qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int16_t, aligned_highp_int16_t, 2); + + /// High qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int32_t, aligned_highp_int32_t, 4); + + /// High qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int64_t, aligned_highp_int64_t, 8); + + + /// High qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_i8, aligned_highp_i8, 1); + + /// High qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_i16, aligned_highp_i16, 2); + + /// High qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_i32, aligned_highp_i32, 4); + + /// High qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_i64, aligned_highp_i64, 8); + + + /// Default qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int8, aligned_int8, 1); + + /// Default qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int16, aligned_int16, 2); + + /// Default qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int32, aligned_int32, 4); + + /// Default qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int64, aligned_int64, 8); + + + /// Default qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int8_t, aligned_int8_t, 1); + + /// Default qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int16_t, aligned_int16_t, 2); + + /// Default qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int32_t, aligned_int32_t, 4); + + /// Default qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int64_t, aligned_int64_t, 8); + + + /// Default qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i8, aligned_i8, 1); + + /// Default qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i16, aligned_i16, 2); + + /// Default qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i32, aligned_i32, 4); + + /// Default qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i64, aligned_i64, 8); + + + /// Default qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(ivec1, aligned_ivec1, 4); + + /// Default qualifier 32 bit signed integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(ivec2, aligned_ivec2, 8); + + /// Default qualifier 32 bit signed integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(ivec3, aligned_ivec3, 16); + + /// Default qualifier 32 bit signed integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(ivec4, aligned_ivec4, 16); + + + /// Default qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i8vec1, aligned_i8vec1, 1); + + /// Default qualifier 8 bit signed integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i8vec2, aligned_i8vec2, 2); + + /// Default qualifier 8 bit signed integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i8vec3, aligned_i8vec3, 4); + + /// Default qualifier 8 bit signed integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i8vec4, aligned_i8vec4, 4); + + + /// Default qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i16vec1, aligned_i16vec1, 2); + + /// Default qualifier 16 bit signed integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i16vec2, aligned_i16vec2, 4); + + /// Default qualifier 16 bit signed integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i16vec3, aligned_i16vec3, 8); + + /// Default qualifier 16 bit signed integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i16vec4, aligned_i16vec4, 8); + + + /// Default qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i32vec1, aligned_i32vec1, 4); + + /// Default qualifier 32 bit signed integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i32vec2, aligned_i32vec2, 8); + + /// Default qualifier 32 bit signed integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i32vec3, aligned_i32vec3, 16); + + /// Default qualifier 32 bit signed integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i32vec4, aligned_i32vec4, 16); + + + /// Default qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i64vec1, aligned_i64vec1, 8); + + /// Default qualifier 64 bit signed integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i64vec2, aligned_i64vec2, 16); + + /// Default qualifier 64 bit signed integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i64vec3, aligned_i64vec3, 32); + + /// Default qualifier 64 bit signed integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i64vec4, aligned_i64vec4, 32); + + + ///////////////////////////// + // Unsigned int vector types + + /// Low qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint8, aligned_lowp_uint8, 1); + + /// Low qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint16, aligned_lowp_uint16, 2); + + /// Low qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint32, aligned_lowp_uint32, 4); + + /// Low qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint64, aligned_lowp_uint64, 8); + + + /// Low qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint8_t, aligned_lowp_uint8_t, 1); + + /// Low qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint16_t, aligned_lowp_uint16_t, 2); + + /// Low qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint32_t, aligned_lowp_uint32_t, 4); + + /// Low qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint64_t, aligned_lowp_uint64_t, 8); + + + /// Low qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_u8, aligned_lowp_u8, 1); + + /// Low qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_u16, aligned_lowp_u16, 2); + + /// Low qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_u32, aligned_lowp_u32, 4); + + /// Low qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_u64, aligned_lowp_u64, 8); + + + /// Medium qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint8, aligned_mediump_uint8, 1); + + /// Medium qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint16, aligned_mediump_uint16, 2); + + /// Medium qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint32, aligned_mediump_uint32, 4); + + /// Medium qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint64, aligned_mediump_uint64, 8); + + + /// Medium qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint8_t, aligned_mediump_uint8_t, 1); + + /// Medium qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint16_t, aligned_mediump_uint16_t, 2); + + /// Medium qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint32_t, aligned_mediump_uint32_t, 4); + + /// Medium qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint64_t, aligned_mediump_uint64_t, 8); + + + /// Medium qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_u8, aligned_mediump_u8, 1); + + /// Medium qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_u16, aligned_mediump_u16, 2); + + /// Medium qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_u32, aligned_mediump_u32, 4); + + /// Medium qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_u64, aligned_mediump_u64, 8); + + + /// High qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint8, aligned_highp_uint8, 1); + + /// High qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint16, aligned_highp_uint16, 2); + + /// High qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint32, aligned_highp_uint32, 4); + + /// High qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint64, aligned_highp_uint64, 8); + + + /// High qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint8_t, aligned_highp_uint8_t, 1); + + /// High qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint16_t, aligned_highp_uint16_t, 2); + + /// High qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint32_t, aligned_highp_uint32_t, 4); + + /// High qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint64_t, aligned_highp_uint64_t, 8); + + + /// High qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_u8, aligned_highp_u8, 1); + + /// High qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_u16, aligned_highp_u16, 2); + + /// High qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_u32, aligned_highp_u32, 4); + + /// High qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_u64, aligned_highp_u64, 8); + + + /// Default qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint8, aligned_uint8, 1); + + /// Default qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint16, aligned_uint16, 2); + + /// Default qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint32, aligned_uint32, 4); + + /// Default qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint64, aligned_uint64, 8); + + + /// Default qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint8_t, aligned_uint8_t, 1); + + /// Default qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint16_t, aligned_uint16_t, 2); + + /// Default qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint32_t, aligned_uint32_t, 4); + + /// Default qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint64_t, aligned_uint64_t, 8); + + + /// Default qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u8, aligned_u8, 1); + + /// Default qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u16, aligned_u16, 2); + + /// Default qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u32, aligned_u32, 4); + + /// Default qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u64, aligned_u64, 8); + + + /// Default qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uvec1, aligned_uvec1, 4); + + /// Default qualifier 32 bit unsigned integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uvec2, aligned_uvec2, 8); + + /// Default qualifier 32 bit unsigned integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uvec3, aligned_uvec3, 16); + + /// Default qualifier 32 bit unsigned integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uvec4, aligned_uvec4, 16); + + + /// Default qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u8vec1, aligned_u8vec1, 1); + + /// Default qualifier 8 bit unsigned integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u8vec2, aligned_u8vec2, 2); + + /// Default qualifier 8 bit unsigned integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u8vec3, aligned_u8vec3, 4); + + /// Default qualifier 8 bit unsigned integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u8vec4, aligned_u8vec4, 4); + + + /// Default qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u16vec1, aligned_u16vec1, 2); + + /// Default qualifier 16 bit unsigned integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u16vec2, aligned_u16vec2, 4); + + /// Default qualifier 16 bit unsigned integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u16vec3, aligned_u16vec3, 8); + + /// Default qualifier 16 bit unsigned integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u16vec4, aligned_u16vec4, 8); + + + /// Default qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u32vec1, aligned_u32vec1, 4); + + /// Default qualifier 32 bit unsigned integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u32vec2, aligned_u32vec2, 8); + + /// Default qualifier 32 bit unsigned integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u32vec3, aligned_u32vec3, 16); + + /// Default qualifier 32 bit unsigned integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u32vec4, aligned_u32vec4, 16); + + + /// Default qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u64vec1, aligned_u64vec1, 8); + + /// Default qualifier 64 bit unsigned integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u64vec2, aligned_u64vec2, 16); + + /// Default qualifier 64 bit unsigned integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u64vec3, aligned_u64vec3, 32); + + /// Default qualifier 64 bit unsigned integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u64vec4, aligned_u64vec4, 32); + + + ////////////////////// + // Float vector types + + /// 32 bit single-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float32, aligned_float32, 4); + + /// 32 bit single-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float32_t, aligned_float32_t, 4); + + /// 32 bit single-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float32, aligned_f32, 4); + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// 64 bit double-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float64, aligned_float64, 8); + + /// 64 bit double-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float64_t, aligned_float64_t, 8); + + /// 64 bit double-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float64, aligned_f64, 8); + +# endif//GLM_FORCE_SINGLE_ONLY + + + /// Single-qualifier floating-point aligned vector of 1 component. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(vec1, aligned_vec1, 4); + + /// Single-qualifier floating-point aligned vector of 2 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(vec2, aligned_vec2, 8); + + /// Single-qualifier floating-point aligned vector of 3 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(vec3, aligned_vec3, 16); + + /// Single-qualifier floating-point aligned vector of 4 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(vec4, aligned_vec4, 16); + + + /// Single-qualifier floating-point aligned vector of 1 component. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fvec1, aligned_fvec1, 4); + + /// Single-qualifier floating-point aligned vector of 2 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fvec2, aligned_fvec2, 8); + + /// Single-qualifier floating-point aligned vector of 3 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fvec3, aligned_fvec3, 16); + + /// Single-qualifier floating-point aligned vector of 4 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fvec4, aligned_fvec4, 16); + + + /// Single-qualifier floating-point aligned vector of 1 component. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32vec1, aligned_f32vec1, 4); + + /// Single-qualifier floating-point aligned vector of 2 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32vec2, aligned_f32vec2, 8); + + /// Single-qualifier floating-point aligned vector of 3 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32vec3, aligned_f32vec3, 16); + + /// Single-qualifier floating-point aligned vector of 4 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32vec4, aligned_f32vec4, 16); + + + /// Double-qualifier floating-point aligned vector of 1 component. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(dvec1, aligned_dvec1, 8); + + /// Double-qualifier floating-point aligned vector of 2 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(dvec2, aligned_dvec2, 16); + + /// Double-qualifier floating-point aligned vector of 3 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(dvec3, aligned_dvec3, 32); + + /// Double-qualifier floating-point aligned vector of 4 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(dvec4, aligned_dvec4, 32); + + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point aligned vector of 1 component. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64vec1, aligned_f64vec1, 8); + + /// Double-qualifier floating-point aligned vector of 2 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64vec2, aligned_f64vec2, 16); + + /// Double-qualifier floating-point aligned vector of 3 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64vec3, aligned_f64vec3, 32); + + /// Double-qualifier floating-point aligned vector of 4 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64vec4, aligned_f64vec4, 32); + +# endif//GLM_FORCE_SINGLE_ONLY + + ////////////////////// + // Float matrix types + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef detail::tmat1 mat1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat2, aligned_mat2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat3, aligned_mat3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat4, aligned_mat4, 16); + + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef detail::tmat1x1 mat1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat2x2, aligned_mat2x2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat3x3, aligned_mat3x3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat4x4, aligned_mat4x4, 16); + + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef detail::tmat1x1 fmat1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4, 16); + + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef f32 fmat1x1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2x2, 16); + + /// Single-qualifier floating-point aligned 2x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat2x3, aligned_fmat2x3, 16); + + /// Single-qualifier floating-point aligned 2x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat2x4, aligned_fmat2x4, 16); + + /// Single-qualifier floating-point aligned 3x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat3x2, aligned_fmat3x2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3x3, 16); + + /// Single-qualifier floating-point aligned 3x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat3x4, aligned_fmat3x4, 16); + + /// Single-qualifier floating-point aligned 4x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat4x2, aligned_fmat4x2, 16); + + /// Single-qualifier floating-point aligned 4x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat4x3, aligned_fmat4x3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4x4, 16); + + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef detail::tmat1x1 f32mat1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4, 16); + + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef f32 f32mat1x1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2x2, 16); + + /// Single-qualifier floating-point aligned 2x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat2x3, aligned_f32mat2x3, 16); + + /// Single-qualifier floating-point aligned 2x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat2x4, aligned_f32mat2x4, 16); + + /// Single-qualifier floating-point aligned 3x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat3x2, aligned_f32mat3x2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3x3, 16); + + /// Single-qualifier floating-point aligned 3x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat3x4, aligned_f32mat3x4, 16); + + /// Single-qualifier floating-point aligned 4x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat4x2, aligned_f32mat4x2, 16); + + /// Single-qualifier floating-point aligned 4x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat4x3, aligned_f32mat4x3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4x4, 16); + + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef detail::tmat1x1 f64mat1; + + /// Double-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2, 32); + + /// Double-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3, 32); + + /// Double-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4, 32); + + + /// Double-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef f64 f64mat1x1; + + /// Double-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2x2, 32); + + /// Double-qualifier floating-point aligned 2x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat2x3, aligned_f64mat2x3, 32); + + /// Double-qualifier floating-point aligned 2x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat2x4, aligned_f64mat2x4, 32); + + /// Double-qualifier floating-point aligned 3x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat3x2, aligned_f64mat3x2, 32); + + /// Double-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3x3, 32); + + /// Double-qualifier floating-point aligned 3x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat3x4, aligned_f64mat3x4, 32); + + /// Double-qualifier floating-point aligned 4x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat4x2, aligned_f64mat4x2, 32); + + /// Double-qualifier floating-point aligned 4x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat4x3, aligned_f64mat4x3, 32); + + /// Double-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4x4, 32); + +# endif//GLM_FORCE_SINGLE_ONLY + + + ////////////////////////// + // Quaternion types + + /// Single-qualifier floating-point aligned quaternion. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(quat, aligned_quat, 16); + + /// Single-qualifier floating-point aligned quaternion. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(quat, aligned_fquat, 16); + + /// Double-qualifier floating-point aligned quaternion. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(dquat, aligned_dquat, 32); + + /// Single-qualifier floating-point aligned quaternion. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32quat, aligned_f32quat, 16); + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point aligned quaternion. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64quat, aligned_f64quat, 32); + +# endif//GLM_FORCE_SINGLE_ONLY + + /// @} +}//namespace glm + +#include "type_aligned.inl" diff --git a/NothinFancy/dep/include/glm/gtx/type_aligned.inl b/NothinFancy/dep/include/glm/gtx/type_aligned.inl new file mode 100644 index 0000000..54c1b81 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/type_aligned.inl @@ -0,0 +1,6 @@ +/// @ref gtc_type_aligned + +namespace glm +{ + +} diff --git a/NothinFancy/dep/include/glm/gtx/type_trait.hpp b/NothinFancy/dep/include/glm/gtx/type_trait.hpp new file mode 100644 index 0000000..56685c8 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/type_trait.hpp @@ -0,0 +1,85 @@ +/// @ref gtx_type_trait +/// @file glm/gtx/type_trait.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_type_trait GLM_GTX_type_trait +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defines traits for each type. + +#pragma once + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_type_trait is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_type_trait extension included") +# endif +#endif + +// Dependency: +#include "../detail/qualifier.hpp" +#include "../gtc/quaternion.hpp" +#include "../gtx/dual_quaternion.hpp" + +namespace glm +{ + /// @addtogroup gtx_type_trait + /// @{ + + template + struct type + { + static bool const is_vec = false; + static bool const is_mat = false; + static bool const is_quat = false; + static length_t const components = 0; + static length_t const cols = 0; + static length_t const rows = 0; + }; + + template + struct type > + { + static bool const is_vec = true; + static bool const is_mat = false; + static bool const is_quat = false; + static length_t const components = L; + }; + + template + struct type > + { + static bool const is_vec = false; + static bool const is_mat = true; + static bool const is_quat = false; + static length_t const components = C; + static length_t const cols = C; + static length_t const rows = R; + }; + + template + struct type > + { + static bool const is_vec = false; + static bool const is_mat = false; + static bool const is_quat = true; + static length_t const components = 4; + }; + + template + struct type > + { + static bool const is_vec = false; + static bool const is_mat = false; + static bool const is_quat = true; + static length_t const components = 8; + }; + + /// @} +}//namespace glm + +#include "type_trait.inl" diff --git a/NothinFancy/dep/include/glm/gtx/type_trait.inl b/NothinFancy/dep/include/glm/gtx/type_trait.inl new file mode 100644 index 0000000..045de95 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/type_trait.inl @@ -0,0 +1,61 @@ +/// @ref gtx_type_trait + +namespace glm +{ + template + bool const type::is_vec; + template + bool const type::is_mat; + template + bool const type::is_quat; + template + length_t const type::components; + template + length_t const type::cols; + template + length_t const type::rows; + + // vec + template + bool const type >::is_vec; + template + bool const type >::is_mat; + template + bool const type >::is_quat; + template + length_t const type >::components; + + // mat + template + bool const type >::is_vec; + template + bool const type >::is_mat; + template + bool const type >::is_quat; + template + length_t const type >::components; + template + length_t const type >::cols; + template + length_t const type >::rows; + + // tquat + template + bool const type >::is_vec; + template + bool const type >::is_mat; + template + bool const type >::is_quat; + template + length_t const type >::components; + + // tdualquat + template + bool const type >::is_vec; + template + bool const type >::is_mat; + template + bool const type >::is_quat; + template + length_t const type >::components; +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/vec_swizzle.hpp b/NothinFancy/dep/include/glm/gtx/vec_swizzle.hpp new file mode 100644 index 0000000..1c49abc --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/vec_swizzle.hpp @@ -0,0 +1,2782 @@ +/// @ref gtx_vec_swizzle +/// @file glm/gtx/vec_swizzle.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_vec_swizzle GLM_GTX_vec_swizzle +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Functions to perform swizzle operation. + +#pragma once + +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_vec_swizzle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_vec_swizzle extension included") +# endif +#endif + +namespace glm { + // xx + template + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<1, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + // xy + template + GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.y); + } + + template + GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.y); + } + + template + GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.y); + } + + // xz + template + GLM_INLINE glm::vec<2, T, Q> xz(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.z); + } + + template + GLM_INLINE glm::vec<2, T, Q> xz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.z); + } + + // xw + template + GLM_INLINE glm::vec<2, T, Q> xw(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.w); + } + + // yx + template + GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.x); + } + + // yy + template + GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.y); + } + + template + GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.y); + } + + template + GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.y); + } + + // yz + template + GLM_INLINE glm::vec<2, T, Q> yz(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.z); + } + + template + GLM_INLINE glm::vec<2, T, Q> yz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.z); + } + + // yw + template + GLM_INLINE glm::vec<2, T, Q> yw(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.w); + } + + // zx + template + GLM_INLINE glm::vec<2, T, Q> zx(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> zx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.x); + } + + // zy + template + GLM_INLINE glm::vec<2, T, Q> zy(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.y); + } + + template + GLM_INLINE glm::vec<2, T, Q> zy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.y); + } + + // zz + template + GLM_INLINE glm::vec<2, T, Q> zz(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.z); + } + + template + GLM_INLINE glm::vec<2, T, Q> zz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.z); + } + + // zw + template + GLM_INLINE glm::vec<2, T, Q> zw(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.w); + } + + // wx + template + GLM_INLINE glm::vec<2, T, Q> wx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.x); + } + + // wy + template + GLM_INLINE glm::vec<2, T, Q> wy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.y); + } + + // wz + template + GLM_INLINE glm::vec<2, T, Q> wz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.z); + } + + // ww + template + GLM_INLINE glm::vec<2, T, Q> ww(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.w); + } + + // xxx + template + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<1, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + // xxy + template + GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.y); + } + + // xxz + template + GLM_INLINE glm::vec<3, T, Q> xxz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.z); + } + + // xxw + template + GLM_INLINE glm::vec<3, T, Q> xxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.w); + } + + // xyx + template + GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.x); + } + + // xyy + template + GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.y); + } + + // xyz + template + GLM_INLINE glm::vec<3, T, Q> xyz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> xyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.z); + } + + // xyw + template + GLM_INLINE glm::vec<3, T, Q> xyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.w); + } + + // xzx + template + GLM_INLINE glm::vec<3, T, Q> xzx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.x); + } + + // xzy + template + GLM_INLINE glm::vec<3, T, Q> xzy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> xzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.y); + } + + // xzz + template + GLM_INLINE glm::vec<3, T, Q> xzz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> xzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.z); + } + + // xzw + template + GLM_INLINE glm::vec<3, T, Q> xzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.w); + } + + // xwx + template + GLM_INLINE glm::vec<3, T, Q> xwx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.x); + } + + // xwy + template + GLM_INLINE glm::vec<3, T, Q> xwy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.y); + } + + // xwz + template + GLM_INLINE glm::vec<3, T, Q> xwz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.z); + } + + // xww + template + GLM_INLINE glm::vec<3, T, Q> xww(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.w); + } + + // yxx + template + GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.x); + } + + // yxy + template + GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.y); + } + + // yxz + template + GLM_INLINE glm::vec<3, T, Q> yxz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> yxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.z); + } + + // yxw + template + GLM_INLINE glm::vec<3, T, Q> yxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.w); + } + + // yyx + template + GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.x); + } + + // yyy + template + GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.y); + } + + // yyz + template + GLM_INLINE glm::vec<3, T, Q> yyz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> yyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.z); + } + + // yyw + template + GLM_INLINE glm::vec<3, T, Q> yyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.w); + } + + // yzx + template + GLM_INLINE glm::vec<3, T, Q> yzx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> yzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.x); + } + + // yzy + template + GLM_INLINE glm::vec<3, T, Q> yzy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> yzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.y); + } + + // yzz + template + GLM_INLINE glm::vec<3, T, Q> yzz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> yzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.z); + } + + // yzw + template + GLM_INLINE glm::vec<3, T, Q> yzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.w); + } + + // ywx + template + GLM_INLINE glm::vec<3, T, Q> ywx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.x); + } + + // ywy + template + GLM_INLINE glm::vec<3, T, Q> ywy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.y); + } + + // ywz + template + GLM_INLINE glm::vec<3, T, Q> ywz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.z); + } + + // yww + template + GLM_INLINE glm::vec<3, T, Q> yww(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.w); + } + + // zxx + template + GLM_INLINE glm::vec<3, T, Q> zxx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> zxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.x); + } + + // zxy + template + GLM_INLINE glm::vec<3, T, Q> zxy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> zxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.y); + } + + // zxz + template + GLM_INLINE glm::vec<3, T, Q> zxz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> zxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.z); + } + + // zxw + template + GLM_INLINE glm::vec<3, T, Q> zxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.w); + } + + // zyx + template + GLM_INLINE glm::vec<3, T, Q> zyx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> zyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.x); + } + + // zyy + template + GLM_INLINE glm::vec<3, T, Q> zyy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> zyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.y); + } + + // zyz + template + GLM_INLINE glm::vec<3, T, Q> zyz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> zyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.z); + } + + // zyw + template + GLM_INLINE glm::vec<3, T, Q> zyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.w); + } + + // zzx + template + GLM_INLINE glm::vec<3, T, Q> zzx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> zzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.x); + } + + // zzy + template + GLM_INLINE glm::vec<3, T, Q> zzy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> zzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.y); + } + + // zzz + template + GLM_INLINE glm::vec<3, T, Q> zzz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> zzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.z); + } + + // zzw + template + GLM_INLINE glm::vec<3, T, Q> zzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.w); + } + + // zwx + template + GLM_INLINE glm::vec<3, T, Q> zwx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.x); + } + + // zwy + template + GLM_INLINE glm::vec<3, T, Q> zwy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.y); + } + + // zwz + template + GLM_INLINE glm::vec<3, T, Q> zwz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.z); + } + + // zww + template + GLM_INLINE glm::vec<3, T, Q> zww(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.w); + } + + // wxx + template + GLM_INLINE glm::vec<3, T, Q> wxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.x); + } + + // wxy + template + GLM_INLINE glm::vec<3, T, Q> wxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.y); + } + + // wxz + template + GLM_INLINE glm::vec<3, T, Q> wxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.z); + } + + // wxw + template + GLM_INLINE glm::vec<3, T, Q> wxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.w); + } + + // wyx + template + GLM_INLINE glm::vec<3, T, Q> wyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.x); + } + + // wyy + template + GLM_INLINE glm::vec<3, T, Q> wyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.y); + } + + // wyz + template + GLM_INLINE glm::vec<3, T, Q> wyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.z); + } + + // wyw + template + GLM_INLINE glm::vec<3, T, Q> wyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.w); + } + + // wzx + template + GLM_INLINE glm::vec<3, T, Q> wzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.x); + } + + // wzy + template + GLM_INLINE glm::vec<3, T, Q> wzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.y); + } + + // wzz + template + GLM_INLINE glm::vec<3, T, Q> wzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.z); + } + + // wzw + template + GLM_INLINE glm::vec<3, T, Q> wzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.w); + } + + // wwx + template + GLM_INLINE glm::vec<3, T, Q> wwx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.x); + } + + // wwy + template + GLM_INLINE glm::vec<3, T, Q> wwy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.y); + } + + // wwz + template + GLM_INLINE glm::vec<3, T, Q> wwz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.z); + } + + // www + template + GLM_INLINE glm::vec<3, T, Q> www(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.w); + } + + // xxxx + template + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<1, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + // xxxy + template + GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y); + } + + // xxxz + template + GLM_INLINE glm::vec<4, T, Q> xxxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.z); + } + + // xxxw + template + GLM_INLINE glm::vec<4, T, Q> xxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.w); + } + + // xxyx + template + GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x); + } + + // xxyy + template + GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y); + } + + // xxyz + template + GLM_INLINE glm::vec<4, T, Q> xxyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.z); + } + + // xxyw + template + GLM_INLINE glm::vec<4, T, Q> xxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.w); + } + + // xxzx + template + GLM_INLINE glm::vec<4, T, Q> xxzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.x); + } + + // xxzy + template + GLM_INLINE glm::vec<4, T, Q> xxzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.y); + } + + // xxzz + template + GLM_INLINE glm::vec<4, T, Q> xxzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.z); + } + + // xxzw + template + GLM_INLINE glm::vec<4, T, Q> xxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.w); + } + + // xxwx + template + GLM_INLINE glm::vec<4, T, Q> xxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.x); + } + + // xxwy + template + GLM_INLINE glm::vec<4, T, Q> xxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.y); + } + + // xxwz + template + GLM_INLINE glm::vec<4, T, Q> xxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.z); + } + + // xxww + template + GLM_INLINE glm::vec<4, T, Q> xxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.w); + } + + // xyxx + template + GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x); + } + + // xyxy + template + GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y); + } + + // xyxz + template + GLM_INLINE glm::vec<4, T, Q> xyxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.z); + } + + // xyxw + template + GLM_INLINE glm::vec<4, T, Q> xyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.w); + } + + // xyyx + template + GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x); + } + + // xyyy + template + GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y); + } + + // xyyz + template + GLM_INLINE glm::vec<4, T, Q> xyyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.z); + } + + // xyyw + template + GLM_INLINE glm::vec<4, T, Q> xyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.w); + } + + // xyzx + template + GLM_INLINE glm::vec<4, T, Q> xyzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.x); + } + + // xyzy + template + GLM_INLINE glm::vec<4, T, Q> xyzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.y); + } + + // xyzz + template + GLM_INLINE glm::vec<4, T, Q> xyzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.z); + } + + // xyzw + template + GLM_INLINE glm::vec<4, T, Q> xyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.w); + } + + // xywx + template + GLM_INLINE glm::vec<4, T, Q> xywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.x); + } + + // xywy + template + GLM_INLINE glm::vec<4, T, Q> xywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.y); + } + + // xywz + template + GLM_INLINE glm::vec<4, T, Q> xywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.z); + } + + // xyww + template + GLM_INLINE glm::vec<4, T, Q> xyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.w); + } + + // xzxx + template + GLM_INLINE glm::vec<4, T, Q> xzxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.x); + } + + // xzxy + template + GLM_INLINE glm::vec<4, T, Q> xzxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.y); + } + + // xzxz + template + GLM_INLINE glm::vec<4, T, Q> xzxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.z); + } + + // xzxw + template + GLM_INLINE glm::vec<4, T, Q> xzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.w); + } + + // xzyx + template + GLM_INLINE glm::vec<4, T, Q> xzyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.x); + } + + // xzyy + template + GLM_INLINE glm::vec<4, T, Q> xzyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.y); + } + + // xzyz + template + GLM_INLINE glm::vec<4, T, Q> xzyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.z); + } + + // xzyw + template + GLM_INLINE glm::vec<4, T, Q> xzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.w); + } + + // xzzx + template + GLM_INLINE glm::vec<4, T, Q> xzzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.x); + } + + // xzzy + template + GLM_INLINE glm::vec<4, T, Q> xzzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.y); + } + + // xzzz + template + GLM_INLINE glm::vec<4, T, Q> xzzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.z); + } + + // xzzw + template + GLM_INLINE glm::vec<4, T, Q> xzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.w); + } + + // xzwx + template + GLM_INLINE glm::vec<4, T, Q> xzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.x); + } + + // xzwy + template + GLM_INLINE glm::vec<4, T, Q> xzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.y); + } + + // xzwz + template + GLM_INLINE glm::vec<4, T, Q> xzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.z); + } + + // xzww + template + GLM_INLINE glm::vec<4, T, Q> xzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.w); + } + + // xwxx + template + GLM_INLINE glm::vec<4, T, Q> xwxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.x); + } + + // xwxy + template + GLM_INLINE glm::vec<4, T, Q> xwxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.y); + } + + // xwxz + template + GLM_INLINE glm::vec<4, T, Q> xwxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.z); + } + + // xwxw + template + GLM_INLINE glm::vec<4, T, Q> xwxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.w); + } + + // xwyx + template + GLM_INLINE glm::vec<4, T, Q> xwyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.x); + } + + // xwyy + template + GLM_INLINE glm::vec<4, T, Q> xwyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.y); + } + + // xwyz + template + GLM_INLINE glm::vec<4, T, Q> xwyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.z); + } + + // xwyw + template + GLM_INLINE glm::vec<4, T, Q> xwyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.w); + } + + // xwzx + template + GLM_INLINE glm::vec<4, T, Q> xwzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.x); + } + + // xwzy + template + GLM_INLINE glm::vec<4, T, Q> xwzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.y); + } + + // xwzz + template + GLM_INLINE glm::vec<4, T, Q> xwzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.z); + } + + // xwzw + template + GLM_INLINE glm::vec<4, T, Q> xwzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.w); + } + + // xwwx + template + GLM_INLINE glm::vec<4, T, Q> xwwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.x); + } + + // xwwy + template + GLM_INLINE glm::vec<4, T, Q> xwwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.y); + } + + // xwwz + template + GLM_INLINE glm::vec<4, T, Q> xwwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.z); + } + + // xwww + template + GLM_INLINE glm::vec<4, T, Q> xwww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.w); + } + + // yxxx + template + GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x); + } + + // yxxy + template + GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y); + } + + // yxxz + template + GLM_INLINE glm::vec<4, T, Q> yxxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.z); + } + + // yxxw + template + GLM_INLINE glm::vec<4, T, Q> yxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.w); + } + + // yxyx + template + GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x); + } + + // yxyy + template + GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y); + } + + // yxyz + template + GLM_INLINE glm::vec<4, T, Q> yxyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.z); + } + + // yxyw + template + GLM_INLINE glm::vec<4, T, Q> yxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.w); + } + + // yxzx + template + GLM_INLINE glm::vec<4, T, Q> yxzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.x); + } + + // yxzy + template + GLM_INLINE glm::vec<4, T, Q> yxzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.y); + } + + // yxzz + template + GLM_INLINE glm::vec<4, T, Q> yxzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.z); + } + + // yxzw + template + GLM_INLINE glm::vec<4, T, Q> yxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.w); + } + + // yxwx + template + GLM_INLINE glm::vec<4, T, Q> yxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.x); + } + + // yxwy + template + GLM_INLINE glm::vec<4, T, Q> yxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.y); + } + + // yxwz + template + GLM_INLINE glm::vec<4, T, Q> yxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.z); + } + + // yxww + template + GLM_INLINE glm::vec<4, T, Q> yxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.w); + } + + // yyxx + template + GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x); + } + + // yyxy + template + GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y); + } + + // yyxz + template + GLM_INLINE glm::vec<4, T, Q> yyxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.z); + } + + // yyxw + template + GLM_INLINE glm::vec<4, T, Q> yyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.w); + } + + // yyyx + template + GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x); + } + + // yyyy + template + GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y); + } + + // yyyz + template + GLM_INLINE glm::vec<4, T, Q> yyyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.z); + } + + // yyyw + template + GLM_INLINE glm::vec<4, T, Q> yyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.w); + } + + // yyzx + template + GLM_INLINE glm::vec<4, T, Q> yyzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.x); + } + + // yyzy + template + GLM_INLINE glm::vec<4, T, Q> yyzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.y); + } + + // yyzz + template + GLM_INLINE glm::vec<4, T, Q> yyzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.z); + } + + // yyzw + template + GLM_INLINE glm::vec<4, T, Q> yyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.w); + } + + // yywx + template + GLM_INLINE glm::vec<4, T, Q> yywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.x); + } + + // yywy + template + GLM_INLINE glm::vec<4, T, Q> yywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.y); + } + + // yywz + template + GLM_INLINE glm::vec<4, T, Q> yywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.z); + } + + // yyww + template + GLM_INLINE glm::vec<4, T, Q> yyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.w); + } + + // yzxx + template + GLM_INLINE glm::vec<4, T, Q> yzxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.x); + } + + // yzxy + template + GLM_INLINE glm::vec<4, T, Q> yzxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.y); + } + + // yzxz + template + GLM_INLINE glm::vec<4, T, Q> yzxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.z); + } + + // yzxw + template + GLM_INLINE glm::vec<4, T, Q> yzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.w); + } + + // yzyx + template + GLM_INLINE glm::vec<4, T, Q> yzyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.x); + } + + // yzyy + template + GLM_INLINE glm::vec<4, T, Q> yzyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.y); + } + + // yzyz + template + GLM_INLINE glm::vec<4, T, Q> yzyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.z); + } + + // yzyw + template + GLM_INLINE glm::vec<4, T, Q> yzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.w); + } + + // yzzx + template + GLM_INLINE glm::vec<4, T, Q> yzzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.x); + } + + // yzzy + template + GLM_INLINE glm::vec<4, T, Q> yzzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.y); + } + + // yzzz + template + GLM_INLINE glm::vec<4, T, Q> yzzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.z); + } + + // yzzw + template + GLM_INLINE glm::vec<4, T, Q> yzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.w); + } + + // yzwx + template + GLM_INLINE glm::vec<4, T, Q> yzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.x); + } + + // yzwy + template + GLM_INLINE glm::vec<4, T, Q> yzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.y); + } + + // yzwz + template + GLM_INLINE glm::vec<4, T, Q> yzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.z); + } + + // yzww + template + GLM_INLINE glm::vec<4, T, Q> yzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.w); + } + + // ywxx + template + GLM_INLINE glm::vec<4, T, Q> ywxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.x); + } + + // ywxy + template + GLM_INLINE glm::vec<4, T, Q> ywxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.y); + } + + // ywxz + template + GLM_INLINE glm::vec<4, T, Q> ywxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.z); + } + + // ywxw + template + GLM_INLINE glm::vec<4, T, Q> ywxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.w); + } + + // ywyx + template + GLM_INLINE glm::vec<4, T, Q> ywyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.x); + } + + // ywyy + template + GLM_INLINE glm::vec<4, T, Q> ywyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.y); + } + + // ywyz + template + GLM_INLINE glm::vec<4, T, Q> ywyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.z); + } + + // ywyw + template + GLM_INLINE glm::vec<4, T, Q> ywyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.w); + } + + // ywzx + template + GLM_INLINE glm::vec<4, T, Q> ywzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.x); + } + + // ywzy + template + GLM_INLINE glm::vec<4, T, Q> ywzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.y); + } + + // ywzz + template + GLM_INLINE glm::vec<4, T, Q> ywzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.z); + } + + // ywzw + template + GLM_INLINE glm::vec<4, T, Q> ywzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.w); + } + + // ywwx + template + GLM_INLINE glm::vec<4, T, Q> ywwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.x); + } + + // ywwy + template + GLM_INLINE glm::vec<4, T, Q> ywwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.y); + } + + // ywwz + template + GLM_INLINE glm::vec<4, T, Q> ywwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.z); + } + + // ywww + template + GLM_INLINE glm::vec<4, T, Q> ywww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.w); + } + + // zxxx + template + GLM_INLINE glm::vec<4, T, Q> zxxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.x); + } + + // zxxy + template + GLM_INLINE glm::vec<4, T, Q> zxxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.y); + } + + // zxxz + template + GLM_INLINE glm::vec<4, T, Q> zxxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.z); + } + + // zxxw + template + GLM_INLINE glm::vec<4, T, Q> zxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.w); + } + + // zxyx + template + GLM_INLINE glm::vec<4, T, Q> zxyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.x); + } + + // zxyy + template + GLM_INLINE glm::vec<4, T, Q> zxyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.y); + } + + // zxyz + template + GLM_INLINE glm::vec<4, T, Q> zxyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.z); + } + + // zxyw + template + GLM_INLINE glm::vec<4, T, Q> zxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.w); + } + + // zxzx + template + GLM_INLINE glm::vec<4, T, Q> zxzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.x); + } + + // zxzy + template + GLM_INLINE glm::vec<4, T, Q> zxzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.y); + } + + // zxzz + template + GLM_INLINE glm::vec<4, T, Q> zxzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.z); + } + + // zxzw + template + GLM_INLINE glm::vec<4, T, Q> zxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.w); + } + + // zxwx + template + GLM_INLINE glm::vec<4, T, Q> zxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.x); + } + + // zxwy + template + GLM_INLINE glm::vec<4, T, Q> zxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.y); + } + + // zxwz + template + GLM_INLINE glm::vec<4, T, Q> zxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.z); + } + + // zxww + template + GLM_INLINE glm::vec<4, T, Q> zxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.w); + } + + // zyxx + template + GLM_INLINE glm::vec<4, T, Q> zyxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.x); + } + + // zyxy + template + GLM_INLINE glm::vec<4, T, Q> zyxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.y); + } + + // zyxz + template + GLM_INLINE glm::vec<4, T, Q> zyxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.z); + } + + // zyxw + template + GLM_INLINE glm::vec<4, T, Q> zyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.w); + } + + // zyyx + template + GLM_INLINE glm::vec<4, T, Q> zyyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.x); + } + + // zyyy + template + GLM_INLINE glm::vec<4, T, Q> zyyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.y); + } + + // zyyz + template + GLM_INLINE glm::vec<4, T, Q> zyyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.z); + } + + // zyyw + template + GLM_INLINE glm::vec<4, T, Q> zyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.w); + } + + // zyzx + template + GLM_INLINE glm::vec<4, T, Q> zyzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.x); + } + + // zyzy + template + GLM_INLINE glm::vec<4, T, Q> zyzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.y); + } + + // zyzz + template + GLM_INLINE glm::vec<4, T, Q> zyzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.z); + } + + // zyzw + template + GLM_INLINE glm::vec<4, T, Q> zyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.w); + } + + // zywx + template + GLM_INLINE glm::vec<4, T, Q> zywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.x); + } + + // zywy + template + GLM_INLINE glm::vec<4, T, Q> zywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.y); + } + + // zywz + template + GLM_INLINE glm::vec<4, T, Q> zywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.z); + } + + // zyww + template + GLM_INLINE glm::vec<4, T, Q> zyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.w); + } + + // zzxx + template + GLM_INLINE glm::vec<4, T, Q> zzxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.x); + } + + // zzxy + template + GLM_INLINE glm::vec<4, T, Q> zzxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.y); + } + + // zzxz + template + GLM_INLINE glm::vec<4, T, Q> zzxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.z); + } + + // zzxw + template + GLM_INLINE glm::vec<4, T, Q> zzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.w); + } + + // zzyx + template + GLM_INLINE glm::vec<4, T, Q> zzyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.x); + } + + // zzyy + template + GLM_INLINE glm::vec<4, T, Q> zzyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.y); + } + + // zzyz + template + GLM_INLINE glm::vec<4, T, Q> zzyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.z); + } + + // zzyw + template + GLM_INLINE glm::vec<4, T, Q> zzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.w); + } + + // zzzx + template + GLM_INLINE glm::vec<4, T, Q> zzzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.x); + } + + // zzzy + template + GLM_INLINE glm::vec<4, T, Q> zzzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.y); + } + + // zzzz + template + GLM_INLINE glm::vec<4, T, Q> zzzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.z); + } + + // zzzw + template + GLM_INLINE glm::vec<4, T, Q> zzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.w); + } + + // zzwx + template + GLM_INLINE glm::vec<4, T, Q> zzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.x); + } + + // zzwy + template + GLM_INLINE glm::vec<4, T, Q> zzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.y); + } + + // zzwz + template + GLM_INLINE glm::vec<4, T, Q> zzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.z); + } + + // zzww + template + GLM_INLINE glm::vec<4, T, Q> zzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.w); + } + + // zwxx + template + GLM_INLINE glm::vec<4, T, Q> zwxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.x); + } + + // zwxy + template + GLM_INLINE glm::vec<4, T, Q> zwxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.y); + } + + // zwxz + template + GLM_INLINE glm::vec<4, T, Q> zwxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.z); + } + + // zwxw + template + GLM_INLINE glm::vec<4, T, Q> zwxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.w); + } + + // zwyx + template + GLM_INLINE glm::vec<4, T, Q> zwyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.x); + } + + // zwyy + template + GLM_INLINE glm::vec<4, T, Q> zwyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.y); + } + + // zwyz + template + GLM_INLINE glm::vec<4, T, Q> zwyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.z); + } + + // zwyw + template + GLM_INLINE glm::vec<4, T, Q> zwyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.w); + } + + // zwzx + template + GLM_INLINE glm::vec<4, T, Q> zwzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.x); + } + + // zwzy + template + GLM_INLINE glm::vec<4, T, Q> zwzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.y); + } + + // zwzz + template + GLM_INLINE glm::vec<4, T, Q> zwzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.z); + } + + // zwzw + template + GLM_INLINE glm::vec<4, T, Q> zwzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.w); + } + + // zwwx + template + GLM_INLINE glm::vec<4, T, Q> zwwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.x); + } + + // zwwy + template + GLM_INLINE glm::vec<4, T, Q> zwwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.y); + } + + // zwwz + template + GLM_INLINE glm::vec<4, T, Q> zwwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.z); + } + + // zwww + template + GLM_INLINE glm::vec<4, T, Q> zwww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.w); + } + + // wxxx + template + GLM_INLINE glm::vec<4, T, Q> wxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.x); + } + + // wxxy + template + GLM_INLINE glm::vec<4, T, Q> wxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.y); + } + + // wxxz + template + GLM_INLINE glm::vec<4, T, Q> wxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.z); + } + + // wxxw + template + GLM_INLINE glm::vec<4, T, Q> wxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.w); + } + + // wxyx + template + GLM_INLINE glm::vec<4, T, Q> wxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.x); + } + + // wxyy + template + GLM_INLINE glm::vec<4, T, Q> wxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.y); + } + + // wxyz + template + GLM_INLINE glm::vec<4, T, Q> wxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.z); + } + + // wxyw + template + GLM_INLINE glm::vec<4, T, Q> wxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.w); + } + + // wxzx + template + GLM_INLINE glm::vec<4, T, Q> wxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.x); + } + + // wxzy + template + GLM_INLINE glm::vec<4, T, Q> wxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.y); + } + + // wxzz + template + GLM_INLINE glm::vec<4, T, Q> wxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.z); + } + + // wxzw + template + GLM_INLINE glm::vec<4, T, Q> wxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.w); + } + + // wxwx + template + GLM_INLINE glm::vec<4, T, Q> wxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.x); + } + + // wxwy + template + GLM_INLINE glm::vec<4, T, Q> wxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.y); + } + + // wxwz + template + GLM_INLINE glm::vec<4, T, Q> wxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.z); + } + + // wxww + template + GLM_INLINE glm::vec<4, T, Q> wxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.w); + } + + // wyxx + template + GLM_INLINE glm::vec<4, T, Q> wyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.x); + } + + // wyxy + template + GLM_INLINE glm::vec<4, T, Q> wyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.y); + } + + // wyxz + template + GLM_INLINE glm::vec<4, T, Q> wyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.z); + } + + // wyxw + template + GLM_INLINE glm::vec<4, T, Q> wyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.w); + } + + // wyyx + template + GLM_INLINE glm::vec<4, T, Q> wyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.x); + } + + // wyyy + template + GLM_INLINE glm::vec<4, T, Q> wyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.y); + } + + // wyyz + template + GLM_INLINE glm::vec<4, T, Q> wyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.z); + } + + // wyyw + template + GLM_INLINE glm::vec<4, T, Q> wyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.w); + } + + // wyzx + template + GLM_INLINE glm::vec<4, T, Q> wyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.x); + } + + // wyzy + template + GLM_INLINE glm::vec<4, T, Q> wyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.y); + } + + // wyzz + template + GLM_INLINE glm::vec<4, T, Q> wyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.z); + } + + // wyzw + template + GLM_INLINE glm::vec<4, T, Q> wyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.w); + } + + // wywx + template + GLM_INLINE glm::vec<4, T, Q> wywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.x); + } + + // wywy + template + GLM_INLINE glm::vec<4, T, Q> wywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.y); + } + + // wywz + template + GLM_INLINE glm::vec<4, T, Q> wywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.z); + } + + // wyww + template + GLM_INLINE glm::vec<4, T, Q> wyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.w); + } + + // wzxx + template + GLM_INLINE glm::vec<4, T, Q> wzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.x); + } + + // wzxy + template + GLM_INLINE glm::vec<4, T, Q> wzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.y); + } + + // wzxz + template + GLM_INLINE glm::vec<4, T, Q> wzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.z); + } + + // wzxw + template + GLM_INLINE glm::vec<4, T, Q> wzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.w); + } + + // wzyx + template + GLM_INLINE glm::vec<4, T, Q> wzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.x); + } + + // wzyy + template + GLM_INLINE glm::vec<4, T, Q> wzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.y); + } + + // wzyz + template + GLM_INLINE glm::vec<4, T, Q> wzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.z); + } + + // wzyw + template + GLM_INLINE glm::vec<4, T, Q> wzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.w); + } + + // wzzx + template + GLM_INLINE glm::vec<4, T, Q> wzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.x); + } + + // wzzy + template + GLM_INLINE glm::vec<4, T, Q> wzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.y); + } + + // wzzz + template + GLM_INLINE glm::vec<4, T, Q> wzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.z); + } + + // wzzw + template + GLM_INLINE glm::vec<4, T, Q> wzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.w); + } + + // wzwx + template + GLM_INLINE glm::vec<4, T, Q> wzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.x); + } + + // wzwy + template + GLM_INLINE glm::vec<4, T, Q> wzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.y); + } + + // wzwz + template + GLM_INLINE glm::vec<4, T, Q> wzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.z); + } + + // wzww + template + GLM_INLINE glm::vec<4, T, Q> wzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.w); + } + + // wwxx + template + GLM_INLINE glm::vec<4, T, Q> wwxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.x); + } + + // wwxy + template + GLM_INLINE glm::vec<4, T, Q> wwxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.y); + } + + // wwxz + template + GLM_INLINE glm::vec<4, T, Q> wwxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.z); + } + + // wwxw + template + GLM_INLINE glm::vec<4, T, Q> wwxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.w); + } + + // wwyx + template + GLM_INLINE glm::vec<4, T, Q> wwyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.x); + } + + // wwyy + template + GLM_INLINE glm::vec<4, T, Q> wwyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.y); + } + + // wwyz + template + GLM_INLINE glm::vec<4, T, Q> wwyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.z); + } + + // wwyw + template + GLM_INLINE glm::vec<4, T, Q> wwyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.w); + } + + // wwzx + template + GLM_INLINE glm::vec<4, T, Q> wwzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.x); + } + + // wwzy + template + GLM_INLINE glm::vec<4, T, Q> wwzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.y); + } + + // wwzz + template + GLM_INLINE glm::vec<4, T, Q> wwzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.z); + } + + // wwzw + template + GLM_INLINE glm::vec<4, T, Q> wwzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.w); + } + + // wwwx + template + GLM_INLINE glm::vec<4, T, Q> wwwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.x); + } + + // wwwy + template + GLM_INLINE glm::vec<4, T, Q> wwwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.y); + } + + // wwwz + template + GLM_INLINE glm::vec<4, T, Q> wwwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.z); + } + + // wwww + template + GLM_INLINE glm::vec<4, T, Q> wwww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.w); + } + +} diff --git a/NothinFancy/dep/include/glm/gtx/vector_angle.hpp b/NothinFancy/dep/include/glm/gtx/vector_angle.hpp new file mode 100644 index 0000000..9ae4371 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/vector_angle.hpp @@ -0,0 +1,57 @@ +/// @ref gtx_vector_angle +/// @file glm/gtx/vector_angle.hpp +/// +/// @see core (dependence) +/// @see gtx_quaternion (dependence) +/// @see gtx_epsilon (dependence) +/// +/// @defgroup gtx_vector_angle GLM_GTX_vector_angle +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Compute angle between vectors + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/epsilon.hpp" +#include "../gtx/quaternion.hpp" +#include "../gtx/rotate_vector.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_vector_angle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_vector_angle extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_vector_angle + /// @{ + + //! Returns the absolute angle between two vectors. + //! Parameters need to be normalized. + /// @see gtx_vector_angle extension. + template + GLM_FUNC_DECL T angle(vec const& x, vec const& y); + + //! Returns the oriented angle between two 2d vectors. + //! Parameters need to be normalized. + /// @see gtx_vector_angle extension. + template + GLM_FUNC_DECL T orientedAngle(vec<2, T, Q> const& x, vec<2, T, Q> const& y); + + //! Returns the oriented angle between two 3d vectors based from a reference axis. + //! Parameters need to be normalized. + /// @see gtx_vector_angle extension. + template + GLM_FUNC_DECL T orientedAngle(vec<3, T, Q> const& x, vec<3, T, Q> const& y, vec<3, T, Q> const& ref); + + /// @} +}// namespace glm + +#include "vector_angle.inl" diff --git a/NothinFancy/dep/include/glm/gtx/vector_angle.inl b/NothinFancy/dep/include/glm/gtx/vector_angle.inl new file mode 100644 index 0000000..a1f957a --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/vector_angle.inl @@ -0,0 +1,44 @@ +/// @ref gtx_vector_angle + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType angle + ( + genType const& x, + genType const& y + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'angle' only accept floating-point inputs"); + return acos(clamp(dot(x, y), genType(-1), genType(1))); + } + + template + GLM_FUNC_QUALIFIER T angle(vec const& x, vec const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'angle' only accept floating-point inputs"); + return acos(clamp(dot(x, y), T(-1), T(1))); + } + + //! \todo epsilon is hard coded to 0.01 + template + GLM_FUNC_QUALIFIER T orientedAngle(vec<2, T, Q> const& x, vec<2, T, Q> const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'orientedAngle' only accept floating-point inputs"); + T const Angle(acos(clamp(dot(x, y), T(-1), T(1)))); + + if(all(epsilonEqual(y, glm::rotate(x, Angle), T(0.0001)))) + return Angle; + else + return -Angle; + } + + template + GLM_FUNC_QUALIFIER T orientedAngle(vec<3, T, Q> const& x, vec<3, T, Q> const& y, vec<3, T, Q> const& ref) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'orientedAngle' only accept floating-point inputs"); + + T const Angle(acos(clamp(dot(x, y), T(-1), T(1)))); + return mix(Angle, -Angle, dot(ref, cross(x, y)) < T(0)); + } +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/vector_query.hpp b/NothinFancy/dep/include/glm/gtx/vector_query.hpp new file mode 100644 index 0000000..77c7b97 --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/vector_query.hpp @@ -0,0 +1,66 @@ +/// @ref gtx_vector_query +/// @file glm/gtx/vector_query.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_vector_query GLM_GTX_vector_query +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Query informations of vector types + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_vector_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_vector_query extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_vector_query + /// @{ + + //! Check whether two vectors are collinears. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL bool areCollinear(vec const& v0, vec const& v1, T const& epsilon); + + //! Check whether two vectors are orthogonals. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL bool areOrthogonal(vec const& v0, vec const& v1, T const& epsilon); + + //! Check whether a vector is normalized. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL bool isNormalized(vec const& v, T const& epsilon); + + //! Check whether a vector is null. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL bool isNull(vec const& v, T const& epsilon); + + //! Check whether a each component of a vector is null. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL vec isCompNull(vec const& v, T const& epsilon); + + //! Check whether two vectors are orthonormal. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL bool areOrthonormal(vec const& v0, vec const& v1, T const& epsilon); + + /// @} +}// namespace glm + +#include "vector_query.inl" diff --git a/NothinFancy/dep/include/glm/gtx/vector_query.inl b/NothinFancy/dep/include/glm/gtx/vector_query.inl new file mode 100644 index 0000000..d1a5c9b --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/vector_query.inl @@ -0,0 +1,154 @@ +/// @ref gtx_vector_query + +#include + +namespace glm{ +namespace detail +{ + template + struct compute_areCollinear{}; + + template + struct compute_areCollinear<2, T, Q> + { + GLM_FUNC_QUALIFIER static bool call(vec<2, T, Q> const& v0, vec<2, T, Q> const& v1, T const& epsilon) + { + return length(cross(vec<3, T, Q>(v0, static_cast(0)), vec<3, T, Q>(v1, static_cast(0)))) < epsilon; + } + }; + + template + struct compute_areCollinear<3, T, Q> + { + GLM_FUNC_QUALIFIER static bool call(vec<3, T, Q> const& v0, vec<3, T, Q> const& v1, T const& epsilon) + { + return length(cross(v0, v1)) < epsilon; + } + }; + + template + struct compute_areCollinear<4, T, Q> + { + GLM_FUNC_QUALIFIER static bool call(vec<4, T, Q> const& v0, vec<4, T, Q> const& v1, T const& epsilon) + { + return length(cross(vec<3, T, Q>(v0), vec<3, T, Q>(v1))) < epsilon; + } + }; + + template + struct compute_isCompNull{}; + + template + struct compute_isCompNull<2, T, Q> + { + GLM_FUNC_QUALIFIER static vec<2, bool, Q> call(vec<2, T, Q> const& v, T const& epsilon) + { + return vec<2, bool, Q>( + (abs(v.x) < epsilon), + (abs(v.y) < epsilon)); + } + }; + + template + struct compute_isCompNull<3, T, Q> + { + GLM_FUNC_QUALIFIER static vec<3, bool, Q> call(vec<3, T, Q> const& v, T const& epsilon) + { + return vec<3, bool, Q>( + (abs(v.x) < epsilon), + (abs(v.y) < epsilon), + (abs(v.z) < epsilon)); + } + }; + + template + struct compute_isCompNull<4, T, Q> + { + GLM_FUNC_QUALIFIER static vec<4, bool, Q> call(vec<4, T, Q> const& v, T const& epsilon) + { + return vec<4, bool, Q>( + (abs(v.x) < epsilon), + (abs(v.y) < epsilon), + (abs(v.z) < epsilon), + (abs(v.w) < epsilon)); + } + }; + +}//namespace detail + + template + GLM_FUNC_QUALIFIER bool areCollinear(vec const& v0, vec const& v1, T const& epsilon) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'areCollinear' only accept floating-point inputs"); + + return detail::compute_areCollinear::call(v0, v1, epsilon); + } + + template + GLM_FUNC_QUALIFIER bool areOrthogonal(vec const& v0, vec const& v1, T const& epsilon) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'areOrthogonal' only accept floating-point inputs"); + + return abs(dot(v0, v1)) <= max( + static_cast(1), + length(v0)) * max(static_cast(1), length(v1)) * epsilon; + } + + template + GLM_FUNC_QUALIFIER bool isNormalized(vec const& v, T const& epsilon) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isNormalized' only accept floating-point inputs"); + + return abs(length(v) - static_cast(1)) <= static_cast(2) * epsilon; + } + + template + GLM_FUNC_QUALIFIER bool isNull(vec const& v, T const& epsilon) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isNull' only accept floating-point inputs"); + + return length(v) <= epsilon; + } + + template + GLM_FUNC_QUALIFIER vec isCompNull(vec const& v, T const& epsilon) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isCompNull' only accept floating-point inputs"); + + return detail::compute_isCompNull::call(v, epsilon); + } + + template + GLM_FUNC_QUALIFIER vec<2, bool, Q> isCompNull(vec<2, T, Q> const& v, T const& epsilon) + { + return vec<2, bool, Q>( + abs(v.x) < epsilon, + abs(v.y) < epsilon); + } + + template + GLM_FUNC_QUALIFIER vec<3, bool, Q> isCompNull(vec<3, T, Q> const& v, T const& epsilon) + { + return vec<3, bool, Q>( + abs(v.x) < epsilon, + abs(v.y) < epsilon, + abs(v.z) < epsilon); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> isCompNull(vec<4, T, Q> const& v, T const& epsilon) + { + return vec<4, bool, Q>( + abs(v.x) < epsilon, + abs(v.y) < epsilon, + abs(v.z) < epsilon, + abs(v.w) < epsilon); + } + + template + GLM_FUNC_QUALIFIER bool areOrthonormal(vec const& v0, vec const& v1, T const& epsilon) + { + return isNormalized(v0, epsilon) && isNormalized(v1, epsilon) && (abs(dot(v0, v1)) <= epsilon); + } + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/gtx/wrap.hpp b/NothinFancy/dep/include/glm/gtx/wrap.hpp new file mode 100644 index 0000000..ad4eb3f --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/wrap.hpp @@ -0,0 +1,37 @@ +/// @ref gtx_wrap +/// @file glm/gtx/wrap.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_wrap GLM_GTX_wrap +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Wrapping mode of texture coordinates. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../ext/scalar_common.hpp" +#include "../ext/vector_common.hpp" +#include "../gtc/vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_wrap is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_wrap extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_wrap + /// @{ + + /// @} +}// namespace glm + +#include "wrap.inl" diff --git a/NothinFancy/dep/include/glm/gtx/wrap.inl b/NothinFancy/dep/include/glm/gtx/wrap.inl new file mode 100644 index 0000000..4be3b4c --- /dev/null +++ b/NothinFancy/dep/include/glm/gtx/wrap.inl @@ -0,0 +1,6 @@ +/// @ref gtx_wrap + +namespace glm +{ + +}//namespace glm diff --git a/NothinFancy/dep/include/glm/integer.hpp b/NothinFancy/dep/include/glm/integer.hpp new file mode 100644 index 0000000..8817db3 --- /dev/null +++ b/NothinFancy/dep/include/glm/integer.hpp @@ -0,0 +1,212 @@ +/// @ref core +/// @file glm/integer.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.8 Integer Functions +/// +/// @defgroup core_func_integer Integer functions +/// @ingroup core +/// +/// Provides GLSL functions on integer types +/// +/// These all operate component-wise. The description is per component. +/// The notation [a, b] means the set of bits from bit-number a through bit-number +/// b, inclusive. The lowest-order bit is bit 0. +/// +/// Include to use these core features. + +#pragma once + +#include "detail/qualifier.hpp" +#include "common.hpp" +#include "vector_relational.hpp" + +namespace glm +{ + /// @addtogroup core_func_integer + /// @{ + + /// Adds 32-bit unsigned integer x and y, returning the sum + /// modulo pow(2, 32). The value carry is set to 0 if the sum was + /// less than pow(2, 32), or to 1 otherwise. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL uaddCarry man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec uaddCarry( + vec const& x, + vec const& y, + vec & carry); + + /// Subtracts the 32-bit unsigned integer y from x, returning + /// the difference if non-negative, or pow(2, 32) plus the difference + /// otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL usubBorrow man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec usubBorrow( + vec const& x, + vec const& y, + vec & borrow); + + /// Multiplies 32-bit integers x and y, producing a 64-bit + /// result. The 32 least-significant bits are returned in lsb. + /// The 32 most-significant bits are returned in msb. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL umulExtended man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL void umulExtended( + vec const& x, + vec const& y, + vec & msb, + vec & lsb); + + /// Multiplies 32-bit integers x and y, producing a 64-bit + /// result. The 32 least-significant bits are returned in lsb. + /// The 32 most-significant bits are returned in msb. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL imulExtended man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL void imulExtended( + vec const& x, + vec const& y, + vec & msb, + vec & lsb); + + /// Extracts bits [offset, offset + bits - 1] from value, + /// returning them in the least significant bits of the result. + /// For unsigned data types, the most significant bits of the + /// result will be set to zero. For signed data types, the + /// most significant bits will be set to the value of bit offset + base - 1. + /// + /// If bits is zero, the result will be zero. The result will be + /// undefined if offset or bits is negative, or if the sum of + /// offset and bits is greater than the number of bits used + /// to store the operand. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see GLSL bitfieldExtract man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec bitfieldExtract( + vec const& Value, + int Offset, + int Bits); + + /// Returns the insertion the bits least-significant bits of insert into base. + /// + /// The result will have bits [offset, offset + bits - 1] taken + /// from bits [0, bits - 1] of insert, and all other bits taken + /// directly from the corresponding bits of base. If bits is + /// zero, the result will simply be base. The result will be + /// undefined if offset or bits is negative, or if the sum of + /// offset and bits is greater than the number of bits used to + /// store the operand. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar or vector types. + /// + /// @see GLSL bitfieldInsert man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec bitfieldInsert( + vec const& Base, + vec const& Insert, + int Offset, + int Bits); + + /// Returns the reversal of the bits of value. + /// The bit numbered n of the result will be taken from bit (bits - 1) - n of value, + /// where bits is the total number of bits used to represent value. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar or vector types. + /// + /// @see GLSL bitfieldReverse man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec bitfieldReverse(vec const& v); + + /// Returns the number of bits set to 1 in the binary representation of value. + /// + /// @tparam genType Signed or unsigned integer scalar or vector types. + /// + /// @see GLSL bitCount man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL int bitCount(genType v); + + /// Returns the number of bits set to 1 in the binary representation of value. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar or vector types. + /// + /// @see GLSL bitCount man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec bitCount(vec const& v); + + /// Returns the bit number of the least significant bit set to + /// 1 in the binary representation of value. + /// If value is zero, -1 will be returned. + /// + /// @tparam genIUType Signed or unsigned integer scalar types. + /// + /// @see GLSL findLSB man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL int findLSB(genIUType x); + + /// Returns the bit number of the least significant bit set to + /// 1 in the binary representation of value. + /// If value is zero, -1 will be returned. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see GLSL findLSB man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec findLSB(vec const& v); + + /// Returns the bit number of the most significant bit in the binary representation of value. + /// For positive integers, the result will be the bit number of the most significant bit set to 1. + /// For negative integers, the result will be the bit number of the most significant + /// bit set to 0. For a value of zero or negative one, -1 will be returned. + /// + /// @tparam genIUType Signed or unsigned integer scalar types. + /// + /// @see GLSL findMSB man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL int findMSB(genIUType x); + + /// Returns the bit number of the most significant bit in the binary representation of value. + /// For positive integers, the result will be the bit number of the most significant bit set to 1. + /// For negative integers, the result will be the bit number of the most significant + /// bit set to 0. For a value of zero or negative one, -1 will be returned. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see GLSL findMSB man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec findMSB(vec const& v); + + /// @} +}//namespace glm + +#include "detail/func_integer.inl" diff --git a/NothinFancy/dep/include/glm/mat2x2.hpp b/NothinFancy/dep/include/glm/mat2x2.hpp new file mode 100644 index 0000000..96bec96 --- /dev/null +++ b/NothinFancy/dep/include/glm/mat2x2.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat2x2.hpp + +#pragma once +#include "./ext/matrix_double2x2.hpp" +#include "./ext/matrix_double2x2_precision.hpp" +#include "./ext/matrix_float2x2.hpp" +#include "./ext/matrix_float2x2_precision.hpp" + diff --git a/NothinFancy/dep/include/glm/mat2x3.hpp b/NothinFancy/dep/include/glm/mat2x3.hpp new file mode 100644 index 0000000..d68dc25 --- /dev/null +++ b/NothinFancy/dep/include/glm/mat2x3.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat2x3.hpp + +#pragma once +#include "./ext/matrix_double2x3.hpp" +#include "./ext/matrix_double2x3_precision.hpp" +#include "./ext/matrix_float2x3.hpp" +#include "./ext/matrix_float2x3_precision.hpp" + diff --git a/NothinFancy/dep/include/glm/mat2x4.hpp b/NothinFancy/dep/include/glm/mat2x4.hpp new file mode 100644 index 0000000..b04b738 --- /dev/null +++ b/NothinFancy/dep/include/glm/mat2x4.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat2x4.hpp + +#pragma once +#include "./ext/matrix_double2x4.hpp" +#include "./ext/matrix_double2x4_precision.hpp" +#include "./ext/matrix_float2x4.hpp" +#include "./ext/matrix_float2x4_precision.hpp" + diff --git a/NothinFancy/dep/include/glm/mat3x2.hpp b/NothinFancy/dep/include/glm/mat3x2.hpp new file mode 100644 index 0000000..c853153 --- /dev/null +++ b/NothinFancy/dep/include/glm/mat3x2.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat3x2.hpp + +#pragma once +#include "./ext/matrix_double3x2.hpp" +#include "./ext/matrix_double3x2_precision.hpp" +#include "./ext/matrix_float3x2.hpp" +#include "./ext/matrix_float3x2_precision.hpp" + diff --git a/NothinFancy/dep/include/glm/mat3x3.hpp b/NothinFancy/dep/include/glm/mat3x3.hpp new file mode 100644 index 0000000..fd4fa31 --- /dev/null +++ b/NothinFancy/dep/include/glm/mat3x3.hpp @@ -0,0 +1,8 @@ +/// @ref core +/// @file glm/mat3x3.hpp + +#pragma once +#include "./ext/matrix_double3x3.hpp" +#include "./ext/matrix_double3x3_precision.hpp" +#include "./ext/matrix_float3x3.hpp" +#include "./ext/matrix_float3x3_precision.hpp" diff --git a/NothinFancy/dep/include/glm/mat3x4.hpp b/NothinFancy/dep/include/glm/mat3x4.hpp new file mode 100644 index 0000000..6342bf5 --- /dev/null +++ b/NothinFancy/dep/include/glm/mat3x4.hpp @@ -0,0 +1,8 @@ +/// @ref core +/// @file glm/mat3x4.hpp + +#pragma once +#include "./ext/matrix_double3x4.hpp" +#include "./ext/matrix_double3x4_precision.hpp" +#include "./ext/matrix_float3x4.hpp" +#include "./ext/matrix_float3x4_precision.hpp" diff --git a/NothinFancy/dep/include/glm/mat4x2.hpp b/NothinFancy/dep/include/glm/mat4x2.hpp new file mode 100644 index 0000000..e013e46 --- /dev/null +++ b/NothinFancy/dep/include/glm/mat4x2.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat4x2.hpp + +#pragma once +#include "./ext/matrix_double4x2.hpp" +#include "./ext/matrix_double4x2_precision.hpp" +#include "./ext/matrix_float4x2.hpp" +#include "./ext/matrix_float4x2_precision.hpp" + diff --git a/NothinFancy/dep/include/glm/mat4x3.hpp b/NothinFancy/dep/include/glm/mat4x3.hpp new file mode 100644 index 0000000..205725a --- /dev/null +++ b/NothinFancy/dep/include/glm/mat4x3.hpp @@ -0,0 +1,8 @@ +/// @ref core +/// @file glm/mat4x3.hpp + +#pragma once +#include "./ext/matrix_double4x3.hpp" +#include "./ext/matrix_double4x3_precision.hpp" +#include "./ext/matrix_float4x3.hpp" +#include "./ext/matrix_float4x3_precision.hpp" diff --git a/NothinFancy/dep/include/glm/mat4x4.hpp b/NothinFancy/dep/include/glm/mat4x4.hpp new file mode 100644 index 0000000..3515f7f --- /dev/null +++ b/NothinFancy/dep/include/glm/mat4x4.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat4x4.hpp + +#pragma once +#include "./ext/matrix_double4x4.hpp" +#include "./ext/matrix_double4x4_precision.hpp" +#include "./ext/matrix_float4x4.hpp" +#include "./ext/matrix_float4x4_precision.hpp" + diff --git a/NothinFancy/dep/include/glm/matrix.hpp b/NothinFancy/dep/include/glm/matrix.hpp new file mode 100644 index 0000000..6badf53 --- /dev/null +++ b/NothinFancy/dep/include/glm/matrix.hpp @@ -0,0 +1,161 @@ +/// @ref core +/// @file glm/matrix.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions +/// +/// @defgroup core_func_matrix Matrix functions +/// @ingroup core +/// +/// Provides GLSL matrix functions. +/// +/// Include to use these core features. + +#pragma once + +// Dependencies +#include "detail/qualifier.hpp" +#include "detail/setup.hpp" +#include "vec2.hpp" +#include "vec3.hpp" +#include "vec4.hpp" +#include "mat2x2.hpp" +#include "mat2x3.hpp" +#include "mat2x4.hpp" +#include "mat3x2.hpp" +#include "mat3x3.hpp" +#include "mat3x4.hpp" +#include "mat4x2.hpp" +#include "mat4x3.hpp" +#include "mat4x4.hpp" + +namespace glm { +namespace detail +{ + template + struct outerProduct_trait{}; + + template + struct outerProduct_trait<2, 2, T, Q> + { + typedef mat<2, 2, T, Q> type; + }; + + template + struct outerProduct_trait<2, 3, T, Q> + { + typedef mat<3, 2, T, Q> type; + }; + + template + struct outerProduct_trait<2, 4, T, Q> + { + typedef mat<4, 2, T, Q> type; + }; + + template + struct outerProduct_trait<3, 2, T, Q> + { + typedef mat<2, 3, T, Q> type; + }; + + template + struct outerProduct_trait<3, 3, T, Q> + { + typedef mat<3, 3, T, Q> type; + }; + + template + struct outerProduct_trait<3, 4, T, Q> + { + typedef mat<4, 3, T, Q> type; + }; + + template + struct outerProduct_trait<4, 2, T, Q> + { + typedef mat<2, 4, T, Q> type; + }; + + template + struct outerProduct_trait<4, 3, T, Q> + { + typedef mat<3, 4, T, Q> type; + }; + + template + struct outerProduct_trait<4, 4, T, Q> + { + typedef mat<4, 4, T, Q> type; + }; +}//namespace detail + + /// @addtogroup core_func_matrix + /// @{ + + /// Multiply matrix x by matrix y component-wise, i.e., + /// result[i][j] is the scalar product of x[i][j] and y[i][j]. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL matrixCompMult man page + /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions + template + GLM_FUNC_DECL mat matrixCompMult(mat const& x, mat const& y); + + /// Treats the first parameter c as a column vector + /// and the second parameter r as a row vector + /// and does a linear algebraic matrix multiply c * r. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL outerProduct man page + /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions + template + GLM_FUNC_DECL typename detail::outerProduct_trait::type outerProduct(vec const& c, vec const& r); + + /// Returns the transposed matrix of x + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL transpose man page + /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions + template + GLM_FUNC_DECL typename mat::transpose_type transpose(mat const& x); + + /// Return the determinant of a squared matrix. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL determinant man page + /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions + template + GLM_FUNC_DECL T determinant(mat const& m); + + /// Return the inverse of a squared matrix. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL inverse man page + /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions + template + GLM_FUNC_DECL mat inverse(mat const& m); + + /// @} +}//namespace glm + +#include "detail/func_matrix.inl" diff --git a/NothinFancy/dep/include/glm/packing.hpp b/NothinFancy/dep/include/glm/packing.hpp new file mode 100644 index 0000000..ca83ac1 --- /dev/null +++ b/NothinFancy/dep/include/glm/packing.hpp @@ -0,0 +1,173 @@ +/// @ref core +/// @file glm/packing.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions +/// @see gtc_packing +/// +/// @defgroup core_func_packing Floating-Point Pack and Unpack Functions +/// @ingroup core +/// +/// Provides GLSL functions to pack and unpack half, single and double-precision floating point values into more compact integer types. +/// +/// These functions do not operate component-wise, rather as described in each case. +/// +/// Include to use these core features. + +#pragma once + +#include "./ext/vector_uint2.hpp" +#include "./ext/vector_float2.hpp" +#include "./ext/vector_float4.hpp" + +namespace glm +{ + /// @addtogroup core_func_packing + /// @{ + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see GLSL packUnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint packUnorm2x16(vec2 const& v); + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm2x16: round(clamp(v, -1, +1) * 32767.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see GLSL packSnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint packSnorm2x16(vec2 const& v); + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm4x8: round(clamp(c, 0, +1) * 255.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see GLSL packUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint packUnorm4x8(vec4 const& v); + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm4x8: round(clamp(c, -1, +1) * 127.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see GLSL packSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint packSnorm4x8(vec4 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm2x16: f / 65535.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see GLSL unpackUnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec2 unpackUnorm2x16(uint p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm2x16: clamp(f / 32767.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see GLSL unpackSnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec2 unpackSnorm2x16(uint p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm4x8: f / 255.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see GLSL unpackUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec4 unpackUnorm4x8(uint p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm4x8: clamp(f / 127.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see GLSL unpackSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec4 unpackSnorm4x8(uint p); + + /// Returns a double-qualifier value obtained by packing the components of v into a 64-bit value. + /// If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified. + /// Otherwise, the bit- level representation of v is preserved. + /// The first vector component specifies the 32 least significant bits; + /// the second component specifies the 32 most significant bits. + /// + /// @see GLSL packDouble2x32 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL double packDouble2x32(uvec2 const& v); + + /// Returns a two-component unsigned integer vector representation of v. + /// The bit-level representation of v is preserved. + /// The first component of the vector contains the 32 least significant bits of the double; + /// the second component consists the 32 most significant bits. + /// + /// @see GLSL unpackDouble2x32 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uvec2 unpackDouble2x32(double v); + + /// Returns an unsigned integer obtained by converting the components of a two-component floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification, + /// and then packing these two 16- bit integers into a 32-bit unsigned integer. + /// The first vector component specifies the 16 least-significant bits of the result; + /// the second component specifies the 16 most-significant bits. + /// + /// @see GLSL packHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint packHalf2x16(vec2 const& v); + + /// Returns a two-component floating-point vector with components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values, + /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, + /// and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the second component is obtained from the 16 most-significant bits of v. + /// + /// @see GLSL unpackHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec2 unpackHalf2x16(uint v); + + /// @} +}//namespace glm + +#include "detail/func_packing.inl" diff --git a/NothinFancy/dep/include/glm/simd/common.h b/NothinFancy/dep/include/glm/simd/common.h new file mode 100644 index 0000000..9b017cb --- /dev/null +++ b/NothinFancy/dep/include/glm/simd/common.h @@ -0,0 +1,240 @@ +/// @ref simd +/// @file glm/simd/common.h + +#pragma once + +#include "platform.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_add(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_add_ps(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_add(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_add_ss(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_sub(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_sub_ps(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_sub(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_sub_ss(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_mul(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_mul_ps(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_mul(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_mul_ss(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_div(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_div_ps(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_div(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_div_ss(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_div_lowp(glm_f32vec4 a, glm_f32vec4 b) +{ + return glm_vec4_mul(a, _mm_rcp_ps(b)); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_swizzle_xyzw(glm_f32vec4 a) +{ +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + return _mm_permute_ps(a, _MM_SHUFFLE(3, 2, 1, 0)); +# else + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 1, 0)); +# endif +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_fma(glm_f32vec4 a, glm_f32vec4 b, glm_f32vec4 c) +{ +# if (GLM_ARCH & GLM_ARCH_AVX2_BIT) && !(GLM_COMPILER & GLM_COMPILER_CLANG) + return _mm_fmadd_ss(a, b, c); +# else + return _mm_add_ss(_mm_mul_ss(a, b), c); +# endif +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_fma(glm_f32vec4 a, glm_f32vec4 b, glm_f32vec4 c) +{ +# if (GLM_ARCH & GLM_ARCH_AVX2_BIT) && !(GLM_COMPILER & GLM_COMPILER_CLANG) + return _mm_fmadd_ps(a, b, c); +# else + return glm_vec4_add(glm_vec4_mul(a, b), c); +# endif +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_abs(glm_f32vec4 x) +{ + return _mm_and_ps(x, _mm_castsi128_ps(_mm_set1_epi32(0x7FFFFFFF))); +} + +GLM_FUNC_QUALIFIER glm_ivec4 glm_ivec4_abs(glm_ivec4 x) +{ +# if GLM_ARCH & GLM_ARCH_SSSE3_BIT + return _mm_sign_epi32(x, x); +# else + glm_ivec4 const sgn0 = _mm_srai_epi32(x, 31); + glm_ivec4 const inv0 = _mm_xor_si128(x, sgn0); + glm_ivec4 const sub0 = _mm_sub_epi32(inv0, sgn0); + return sub0; +# endif +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_sign(glm_vec4 x) +{ + glm_vec4 const zro0 = _mm_setzero_ps(); + glm_vec4 const cmp0 = _mm_cmplt_ps(x, zro0); + glm_vec4 const cmp1 = _mm_cmpgt_ps(x, zro0); + glm_vec4 const and0 = _mm_and_ps(cmp0, _mm_set1_ps(-1.0f)); + glm_vec4 const and1 = _mm_and_ps(cmp1, _mm_set1_ps(1.0f)); + glm_vec4 const or0 = _mm_or_ps(and0, and1); + return or0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_round(glm_vec4 x) +{ +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + return _mm_round_ps(x, _MM_FROUND_TO_NEAREST_INT); +# else + glm_vec4 const sgn0 = _mm_castsi128_ps(_mm_set1_epi32(int(0x80000000))); + glm_vec4 const and0 = _mm_and_ps(sgn0, x); + glm_vec4 const or0 = _mm_or_ps(and0, _mm_set_ps1(8388608.0f)); + glm_vec4 const add0 = glm_vec4_add(x, or0); + glm_vec4 const sub0 = glm_vec4_sub(add0, or0); + return sub0; +# endif +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_floor(glm_vec4 x) +{ +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + return _mm_floor_ps(x); +# else + glm_vec4 const rnd0 = glm_vec4_round(x); + glm_vec4 const cmp0 = _mm_cmplt_ps(x, rnd0); + glm_vec4 const and0 = _mm_and_ps(cmp0, _mm_set1_ps(1.0f)); + glm_vec4 const sub0 = glm_vec4_sub(rnd0, and0); + return sub0; +# endif +} + +/* trunc TODO +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_trunc(glm_vec4 x) +{ + return glm_vec4(); +} +*/ + +//roundEven +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_roundEven(glm_vec4 x) +{ + glm_vec4 const sgn0 = _mm_castsi128_ps(_mm_set1_epi32(int(0x80000000))); + glm_vec4 const and0 = _mm_and_ps(sgn0, x); + glm_vec4 const or0 = _mm_or_ps(and0, _mm_set_ps1(8388608.0f)); + glm_vec4 const add0 = glm_vec4_add(x, or0); + glm_vec4 const sub0 = glm_vec4_sub(add0, or0); + return sub0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_ceil(glm_vec4 x) +{ +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + return _mm_ceil_ps(x); +# else + glm_vec4 const rnd0 = glm_vec4_round(x); + glm_vec4 const cmp0 = _mm_cmpgt_ps(x, rnd0); + glm_vec4 const and0 = _mm_and_ps(cmp0, _mm_set1_ps(1.0f)); + glm_vec4 const add0 = glm_vec4_add(rnd0, and0); + return add0; +# endif +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_fract(glm_vec4 x) +{ + glm_vec4 const flr0 = glm_vec4_floor(x); + glm_vec4 const sub0 = glm_vec4_sub(x, flr0); + return sub0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_mod(glm_vec4 x, glm_vec4 y) +{ + glm_vec4 const div0 = glm_vec4_div(x, y); + glm_vec4 const flr0 = glm_vec4_floor(div0); + glm_vec4 const mul0 = glm_vec4_mul(y, flr0); + glm_vec4 const sub0 = glm_vec4_sub(x, mul0); + return sub0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_clamp(glm_vec4 v, glm_vec4 minVal, glm_vec4 maxVal) +{ + glm_vec4 const min0 = _mm_min_ps(v, maxVal); + glm_vec4 const max0 = _mm_max_ps(min0, minVal); + return max0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_mix(glm_vec4 v1, glm_vec4 v2, glm_vec4 a) +{ + glm_vec4 const sub0 = glm_vec4_sub(_mm_set1_ps(1.0f), a); + glm_vec4 const mul0 = glm_vec4_mul(v1, sub0); + glm_vec4 const mad0 = glm_vec4_fma(v2, a, mul0); + return mad0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_step(glm_vec4 edge, glm_vec4 x) +{ + glm_vec4 const cmp = _mm_cmple_ps(x, edge); + return _mm_movemask_ps(cmp) == 0 ? _mm_set1_ps(1.0f) : _mm_setzero_ps(); +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_smoothstep(glm_vec4 edge0, glm_vec4 edge1, glm_vec4 x) +{ + glm_vec4 const sub0 = glm_vec4_sub(x, edge0); + glm_vec4 const sub1 = glm_vec4_sub(edge1, edge0); + glm_vec4 const div0 = glm_vec4_sub(sub0, sub1); + glm_vec4 const clp0 = glm_vec4_clamp(div0, _mm_setzero_ps(), _mm_set1_ps(1.0f)); + glm_vec4 const mul0 = glm_vec4_mul(_mm_set1_ps(2.0f), clp0); + glm_vec4 const sub2 = glm_vec4_sub(_mm_set1_ps(3.0f), mul0); + glm_vec4 const mul1 = glm_vec4_mul(clp0, clp0); + glm_vec4 const mul2 = glm_vec4_mul(mul1, sub2); + return mul2; +} + +// Agner Fog method +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_nan(glm_vec4 x) +{ + glm_ivec4 const t1 = _mm_castps_si128(x); // reinterpret as 32-bit integer + glm_ivec4 const t2 = _mm_sll_epi32(t1, _mm_cvtsi32_si128(1)); // shift out sign bit + glm_ivec4 const t3 = _mm_set1_epi32(int(0xFF000000)); // exponent mask + glm_ivec4 const t4 = _mm_and_si128(t2, t3); // exponent + glm_ivec4 const t5 = _mm_andnot_si128(t3, t2); // fraction + glm_ivec4 const Equal = _mm_cmpeq_epi32(t3, t4); + glm_ivec4 const Nequal = _mm_cmpeq_epi32(t5, _mm_setzero_si128()); + glm_ivec4 const And = _mm_and_si128(Equal, Nequal); + return _mm_castsi128_ps(And); // exponent = all 1s and fraction != 0 +} + +// Agner Fog method +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_inf(glm_vec4 x) +{ + glm_ivec4 const t1 = _mm_castps_si128(x); // reinterpret as 32-bit integer + glm_ivec4 const t2 = _mm_sll_epi32(t1, _mm_cvtsi32_si128(1)); // shift out sign bit + return _mm_castsi128_ps(_mm_cmpeq_epi32(t2, _mm_set1_epi32(int(0xFF000000)))); // exponent is all 1s, fraction is 0 +} + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/simd/exponential.h b/NothinFancy/dep/include/glm/simd/exponential.h new file mode 100644 index 0000000..bc351d0 --- /dev/null +++ b/NothinFancy/dep/include/glm/simd/exponential.h @@ -0,0 +1,20 @@ +/// @ref simd +/// @file glm/simd/experimental.h + +#pragma once + +#include "platform.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_sqrt_lowp(glm_f32vec4 x) +{ + return _mm_mul_ss(_mm_rsqrt_ss(x), x); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_sqrt_lowp(glm_f32vec4 x) +{ + return _mm_mul_ps(_mm_rsqrt_ps(x), x); +} + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/simd/geometric.h b/NothinFancy/dep/include/glm/simd/geometric.h new file mode 100644 index 0000000..07d7cbc --- /dev/null +++ b/NothinFancy/dep/include/glm/simd/geometric.h @@ -0,0 +1,124 @@ +/// @ref simd +/// @file glm/simd/geometric.h + +#pragma once + +#include "common.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +GLM_FUNC_DECL glm_vec4 glm_vec4_dot(glm_vec4 v1, glm_vec4 v2); +GLM_FUNC_DECL glm_vec4 glm_vec1_dot(glm_vec4 v1, glm_vec4 v2); + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_length(glm_vec4 x) +{ + glm_vec4 const dot0 = glm_vec4_dot(x, x); + glm_vec4 const sqt0 = _mm_sqrt_ps(dot0); + return sqt0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_distance(glm_vec4 p0, glm_vec4 p1) +{ + glm_vec4 const sub0 = _mm_sub_ps(p0, p1); + glm_vec4 const len0 = glm_vec4_length(sub0); + return len0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_dot(glm_vec4 v1, glm_vec4 v2) +{ +# if GLM_ARCH & GLM_ARCH_AVX_BIT + return _mm_dp_ps(v1, v2, 0xff); +# elif GLM_ARCH & GLM_ARCH_SSE3_BIT + glm_vec4 const mul0 = _mm_mul_ps(v1, v2); + glm_vec4 const hadd0 = _mm_hadd_ps(mul0, mul0); + glm_vec4 const hadd1 = _mm_hadd_ps(hadd0, hadd0); + return hadd1; +# else + glm_vec4 const mul0 = _mm_mul_ps(v1, v2); + glm_vec4 const swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1)); + glm_vec4 const add0 = _mm_add_ps(mul0, swp0); + glm_vec4 const swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3)); + glm_vec4 const add1 = _mm_add_ps(add0, swp1); + return add1; +# endif +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec1_dot(glm_vec4 v1, glm_vec4 v2) +{ +# if GLM_ARCH & GLM_ARCH_AVX_BIT + return _mm_dp_ps(v1, v2, 0xff); +# elif GLM_ARCH & GLM_ARCH_SSE3_BIT + glm_vec4 const mul0 = _mm_mul_ps(v1, v2); + glm_vec4 const had0 = _mm_hadd_ps(mul0, mul0); + glm_vec4 const had1 = _mm_hadd_ps(had0, had0); + return had1; +# else + glm_vec4 const mul0 = _mm_mul_ps(v1, v2); + glm_vec4 const mov0 = _mm_movehl_ps(mul0, mul0); + glm_vec4 const add0 = _mm_add_ps(mov0, mul0); + glm_vec4 const swp1 = _mm_shuffle_ps(add0, add0, 1); + glm_vec4 const add1 = _mm_add_ss(add0, swp1); + return add1; +# endif +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_cross(glm_vec4 v1, glm_vec4 v2) +{ + glm_vec4 const swp0 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1)); + glm_vec4 const swp1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 1, 0, 2)); + glm_vec4 const swp2 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1)); + glm_vec4 const swp3 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 1, 0, 2)); + glm_vec4 const mul0 = _mm_mul_ps(swp0, swp3); + glm_vec4 const mul1 = _mm_mul_ps(swp1, swp2); + glm_vec4 const sub0 = _mm_sub_ps(mul0, mul1); + return sub0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_normalize(glm_vec4 v) +{ + glm_vec4 const dot0 = glm_vec4_dot(v, v); + glm_vec4 const isr0 = _mm_rsqrt_ps(dot0); + glm_vec4 const mul0 = _mm_mul_ps(v, isr0); + return mul0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_faceforward(glm_vec4 N, glm_vec4 I, glm_vec4 Nref) +{ + glm_vec4 const dot0 = glm_vec4_dot(Nref, I); + glm_vec4 const sgn0 = glm_vec4_sign(dot0); + glm_vec4 const mul0 = _mm_mul_ps(sgn0, _mm_set1_ps(-1.0f)); + glm_vec4 const mul1 = _mm_mul_ps(N, mul0); + return mul1; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_reflect(glm_vec4 I, glm_vec4 N) +{ + glm_vec4 const dot0 = glm_vec4_dot(N, I); + glm_vec4 const mul0 = _mm_mul_ps(N, dot0); + glm_vec4 const mul1 = _mm_mul_ps(mul0, _mm_set1_ps(2.0f)); + glm_vec4 const sub0 = _mm_sub_ps(I, mul1); + return sub0; +} + +GLM_FUNC_QUALIFIER __m128 glm_vec4_refract(glm_vec4 I, glm_vec4 N, glm_vec4 eta) +{ + glm_vec4 const dot0 = glm_vec4_dot(N, I); + glm_vec4 const mul0 = _mm_mul_ps(eta, eta); + glm_vec4 const mul1 = _mm_mul_ps(dot0, dot0); + glm_vec4 const sub0 = _mm_sub_ps(_mm_set1_ps(1.0f), mul0); + glm_vec4 const sub1 = _mm_sub_ps(_mm_set1_ps(1.0f), mul1); + glm_vec4 const mul2 = _mm_mul_ps(sub0, sub1); + + if(_mm_movemask_ps(_mm_cmplt_ss(mul2, _mm_set1_ps(0.0f))) == 0) + return _mm_set1_ps(0.0f); + + glm_vec4 const sqt0 = _mm_sqrt_ps(mul2); + glm_vec4 const mad0 = glm_vec4_fma(eta, dot0, sqt0); + glm_vec4 const mul4 = _mm_mul_ps(mad0, N); + glm_vec4 const mul5 = _mm_mul_ps(eta, I); + glm_vec4 const sub2 = _mm_sub_ps(mul5, mul4); + + return sub2; +} + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/simd/integer.h b/NothinFancy/dep/include/glm/simd/integer.h new file mode 100644 index 0000000..9381418 --- /dev/null +++ b/NothinFancy/dep/include/glm/simd/integer.h @@ -0,0 +1,115 @@ +/// @ref simd +/// @file glm/simd/integer.h + +#pragma once + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +GLM_FUNC_QUALIFIER glm_uvec4 glm_i128_interleave(glm_uvec4 x) +{ + glm_uvec4 const Mask4 = _mm_set1_epi32(0x0000FFFF); + glm_uvec4 const Mask3 = _mm_set1_epi32(0x00FF00FF); + glm_uvec4 const Mask2 = _mm_set1_epi32(0x0F0F0F0F); + glm_uvec4 const Mask1 = _mm_set1_epi32(0x33333333); + glm_uvec4 const Mask0 = _mm_set1_epi32(0x55555555); + + glm_uvec4 Reg1; + glm_uvec4 Reg2; + + // REG1 = x; + // REG2 = y; + //Reg1 = _mm_unpacklo_epi64(x, y); + Reg1 = x; + + //REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF); + //REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF); + Reg2 = _mm_slli_si128(Reg1, 2); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask4); + + //REG1 = ((REG1 << 8) | REG1) & glm::uint64(0x00FF00FF00FF00FF); + //REG2 = ((REG2 << 8) | REG2) & glm::uint64(0x00FF00FF00FF00FF); + Reg2 = _mm_slli_si128(Reg1, 1); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask3); + + //REG1 = ((REG1 << 4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F); + //REG2 = ((REG2 << 4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F); + Reg2 = _mm_slli_epi32(Reg1, 4); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask2); + + //REG1 = ((REG1 << 2) | REG1) & glm::uint64(0x3333333333333333); + //REG2 = ((REG2 << 2) | REG2) & glm::uint64(0x3333333333333333); + Reg2 = _mm_slli_epi32(Reg1, 2); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask1); + + //REG1 = ((REG1 << 1) | REG1) & glm::uint64(0x5555555555555555); + //REG2 = ((REG2 << 1) | REG2) & glm::uint64(0x5555555555555555); + Reg2 = _mm_slli_epi32(Reg1, 1); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask0); + + //return REG1 | (REG2 << 1); + Reg2 = _mm_slli_epi32(Reg1, 1); + Reg2 = _mm_srli_si128(Reg2, 8); + Reg1 = _mm_or_si128(Reg1, Reg2); + + return Reg1; +} + +GLM_FUNC_QUALIFIER glm_uvec4 glm_i128_interleave2(glm_uvec4 x, glm_uvec4 y) +{ + glm_uvec4 const Mask4 = _mm_set1_epi32(0x0000FFFF); + glm_uvec4 const Mask3 = _mm_set1_epi32(0x00FF00FF); + glm_uvec4 const Mask2 = _mm_set1_epi32(0x0F0F0F0F); + glm_uvec4 const Mask1 = _mm_set1_epi32(0x33333333); + glm_uvec4 const Mask0 = _mm_set1_epi32(0x55555555); + + glm_uvec4 Reg1; + glm_uvec4 Reg2; + + // REG1 = x; + // REG2 = y; + Reg1 = _mm_unpacklo_epi64(x, y); + + //REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF); + //REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF); + Reg2 = _mm_slli_si128(Reg1, 2); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask4); + + //REG1 = ((REG1 << 8) | REG1) & glm::uint64(0x00FF00FF00FF00FF); + //REG2 = ((REG2 << 8) | REG2) & glm::uint64(0x00FF00FF00FF00FF); + Reg2 = _mm_slli_si128(Reg1, 1); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask3); + + //REG1 = ((REG1 << 4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F); + //REG2 = ((REG2 << 4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F); + Reg2 = _mm_slli_epi32(Reg1, 4); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask2); + + //REG1 = ((REG1 << 2) | REG1) & glm::uint64(0x3333333333333333); + //REG2 = ((REG2 << 2) | REG2) & glm::uint64(0x3333333333333333); + Reg2 = _mm_slli_epi32(Reg1, 2); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask1); + + //REG1 = ((REG1 << 1) | REG1) & glm::uint64(0x5555555555555555); + //REG2 = ((REG2 << 1) | REG2) & glm::uint64(0x5555555555555555); + Reg2 = _mm_slli_epi32(Reg1, 1); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask0); + + //return REG1 | (REG2 << 1); + Reg2 = _mm_slli_epi32(Reg1, 1); + Reg2 = _mm_srli_si128(Reg2, 8); + Reg1 = _mm_or_si128(Reg1, Reg2); + + return Reg1; +} + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/simd/matrix.h b/NothinFancy/dep/include/glm/simd/matrix.h new file mode 100644 index 0000000..b6c42ea --- /dev/null +++ b/NothinFancy/dep/include/glm/simd/matrix.h @@ -0,0 +1,1028 @@ +/// @ref simd +/// @file glm/simd/matrix.h + +#pragma once + +#include "geometric.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +GLM_FUNC_QUALIFIER void glm_mat4_matrixCompMult(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4]) +{ + out[0] = _mm_mul_ps(in1[0], in2[0]); + out[1] = _mm_mul_ps(in1[1], in2[1]); + out[2] = _mm_mul_ps(in1[2], in2[2]); + out[3] = _mm_mul_ps(in1[3], in2[3]); +} + +GLM_FUNC_QUALIFIER void glm_mat4_add(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4]) +{ + out[0] = _mm_add_ps(in1[0], in2[0]); + out[1] = _mm_add_ps(in1[1], in2[1]); + out[2] = _mm_add_ps(in1[2], in2[2]); + out[3] = _mm_add_ps(in1[3], in2[3]); +} + +GLM_FUNC_QUALIFIER void glm_mat4_sub(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4]) +{ + out[0] = _mm_sub_ps(in1[0], in2[0]); + out[1] = _mm_sub_ps(in1[1], in2[1]); + out[2] = _mm_sub_ps(in1[2], in2[2]); + out[3] = _mm_sub_ps(in1[3], in2[3]); +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_mul_vec4(glm_vec4 const m[4], glm_vec4 v) +{ + __m128 v0 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 v1 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1)); + __m128 v2 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 v3 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(m[0], v0); + __m128 m1 = _mm_mul_ps(m[1], v1); + __m128 m2 = _mm_mul_ps(m[2], v2); + __m128 m3 = _mm_mul_ps(m[3], v3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + return a2; +} + +GLM_FUNC_QUALIFIER __m128 glm_vec4_mul_mat4(glm_vec4 v, glm_vec4 const m[4]) +{ + __m128 i0 = m[0]; + __m128 i1 = m[1]; + __m128 i2 = m[2]; + __m128 i3 = m[3]; + + __m128 m0 = _mm_mul_ps(v, i0); + __m128 m1 = _mm_mul_ps(v, i1); + __m128 m2 = _mm_mul_ps(v, i2); + __m128 m3 = _mm_mul_ps(v, i3); + + __m128 u0 = _mm_unpacklo_ps(m0, m1); + __m128 u1 = _mm_unpackhi_ps(m0, m1); + __m128 a0 = _mm_add_ps(u0, u1); + + __m128 u2 = _mm_unpacklo_ps(m2, m3); + __m128 u3 = _mm_unpackhi_ps(m2, m3); + __m128 a1 = _mm_add_ps(u2, u3); + + __m128 f0 = _mm_movelh_ps(a0, a1); + __m128 f1 = _mm_movehl_ps(a1, a0); + __m128 f2 = _mm_add_ps(f0, f1); + + return f2; +} + +GLM_FUNC_QUALIFIER void glm_mat4_mul(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4]) +{ + { + __m128 e0 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[0] = a2; + } + + { + __m128 e0 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[1] = a2; + } + + { + __m128 e0 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[2] = a2; + } + + { + //(__m128&)_mm_shuffle_epi32(__m128i&)in2[0], _MM_SHUFFLE(3, 3, 3, 3)) + __m128 e0 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[3] = a2; + } +} + +GLM_FUNC_QUALIFIER void glm_mat4_transpose(glm_vec4 const in[4], glm_vec4 out[4]) +{ + __m128 tmp0 = _mm_shuffle_ps(in[0], in[1], 0x44); + __m128 tmp2 = _mm_shuffle_ps(in[0], in[1], 0xEE); + __m128 tmp1 = _mm_shuffle_ps(in[2], in[3], 0x44); + __m128 tmp3 = _mm_shuffle_ps(in[2], in[3], 0xEE); + + out[0] = _mm_shuffle_ps(tmp0, tmp1, 0x88); + out[1] = _mm_shuffle_ps(tmp0, tmp1, 0xDD); + out[2] = _mm_shuffle_ps(tmp2, tmp3, 0x88); + out[3] = _mm_shuffle_ps(tmp2, tmp3, 0xDD); +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant_highp(glm_vec4 const in[4]) +{ + __m128 Fac0; + { + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac0 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac1; + { + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac1 = _mm_sub_ps(Mul00, Mul01); + } + + + __m128 Fac2; + { + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac2 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac3; + { + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac3 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac4; + { + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac4 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac5; + { + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac5 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f); + __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f); + + // m[1][0] + // m[0][0] + // m[0][0] + // m[0][0] + __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][1] + // m[0][1] + // m[0][1] + // m[0][1] + __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][2] + // m[0][2] + // m[0][2] + // m[0][2] + __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][3] + // m[0][3] + // m[0][3] + // m[0][3] + __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0)); + + // col0 + // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]), + // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]), + // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]), + // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]), + __m128 Mul00 = _mm_mul_ps(Vec1, Fac0); + __m128 Mul01 = _mm_mul_ps(Vec2, Fac1); + __m128 Mul02 = _mm_mul_ps(Vec3, Fac2); + __m128 Sub00 = _mm_sub_ps(Mul00, Mul01); + __m128 Add00 = _mm_add_ps(Sub00, Mul02); + __m128 Inv0 = _mm_mul_ps(SignB, Add00); + + // col1 + // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]), + // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]), + // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]), + // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]), + __m128 Mul03 = _mm_mul_ps(Vec0, Fac0); + __m128 Mul04 = _mm_mul_ps(Vec2, Fac3); + __m128 Mul05 = _mm_mul_ps(Vec3, Fac4); + __m128 Sub01 = _mm_sub_ps(Mul03, Mul04); + __m128 Add01 = _mm_add_ps(Sub01, Mul05); + __m128 Inv1 = _mm_mul_ps(SignA, Add01); + + // col2 + // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]), + // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]), + // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]), + // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]), + __m128 Mul06 = _mm_mul_ps(Vec0, Fac1); + __m128 Mul07 = _mm_mul_ps(Vec1, Fac3); + __m128 Mul08 = _mm_mul_ps(Vec3, Fac5); + __m128 Sub02 = _mm_sub_ps(Mul06, Mul07); + __m128 Add02 = _mm_add_ps(Sub02, Mul08); + __m128 Inv2 = _mm_mul_ps(SignB, Add02); + + // col3 + // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]), + // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]), + // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]), + // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3])); + __m128 Mul09 = _mm_mul_ps(Vec0, Fac2); + __m128 Mul10 = _mm_mul_ps(Vec1, Fac4); + __m128 Mul11 = _mm_mul_ps(Vec2, Fac5); + __m128 Sub03 = _mm_sub_ps(Mul09, Mul10); + __m128 Add03 = _mm_add_ps(Sub03, Mul11); + __m128 Inv3 = _mm_mul_ps(SignA, Add03); + + __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); + + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] + // + m[0][3] * Inverse[3][0]; + __m128 Det0 = glm_vec4_dot(in[0], Row2); + return Det0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant_lowp(glm_vec4 const m[4]) +{ + // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128( + + //T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + //T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + //T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + //T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + //T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + //T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + + // First 2 columns + __m128 Swp2A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 1, 1, 2))); + __m128 Swp3A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(3, 2, 3, 3))); + __m128 MulA = _mm_mul_ps(Swp2A, Swp3A); + + // Second 2 columns + __m128 Swp2B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(3, 2, 3, 3))); + __m128 Swp3B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(0, 1, 1, 2))); + __m128 MulB = _mm_mul_ps(Swp2B, Swp3B); + + // Columns subtraction + __m128 SubE = _mm_sub_ps(MulA, MulB); + + // Last 2 rows + __m128 Swp2C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 0, 1, 2))); + __m128 Swp3C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(1, 2, 0, 0))); + __m128 MulC = _mm_mul_ps(Swp2C, Swp3C); + __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC); + + //vec<4, T, Q> DetCof( + // + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), + // - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + // + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), + // - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); + + __m128 SubFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubE), _MM_SHUFFLE(2, 1, 0, 0))); + __m128 SwpFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(0, 0, 0, 1))); + __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA); + + __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1)); + __m128 SubFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpB), _MM_SHUFFLE(3, 1, 1, 0)));//SubF[0], SubE[3], SubE[3], SubE[1]; + __m128 SwpFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(1, 1, 2, 2))); + __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB); + + __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB); + + __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2)); + __m128 SubFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpC), _MM_SHUFFLE(3, 3, 2, 0))); + __m128 SwpFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(2, 3, 3, 3))); + __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC); + + __m128 AddRes = _mm_add_ps(SubRes, MulFacC); + __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f)); + + //return m[0][0] * DetCof[0] + // + m[0][1] * DetCof[1] + // + m[0][2] * DetCof[2] + // + m[0][3] * DetCof[3]; + + return glm_vec4_dot(m[0], DetCof); +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant(glm_vec4 const m[4]) +{ + // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(add) + + //T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + //T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + //T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + //T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + //T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + //T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + + // First 2 columns + __m128 Swp2A = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 1, 1, 2)); + __m128 Swp3A = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(3, 2, 3, 3)); + __m128 MulA = _mm_mul_ps(Swp2A, Swp3A); + + // Second 2 columns + __m128 Swp2B = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(3, 2, 3, 3)); + __m128 Swp3B = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(0, 1, 1, 2)); + __m128 MulB = _mm_mul_ps(Swp2B, Swp3B); + + // Columns subtraction + __m128 SubE = _mm_sub_ps(MulA, MulB); + + // Last 2 rows + __m128 Swp2C = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 0, 1, 2)); + __m128 Swp3C = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(1, 2, 0, 0)); + __m128 MulC = _mm_mul_ps(Swp2C, Swp3C); + __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC); + + //vec<4, T, Q> DetCof( + // + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), + // - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + // + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), + // - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); + + __m128 SubFacA = _mm_shuffle_ps(SubE, SubE, _MM_SHUFFLE(2, 1, 0, 0)); + __m128 SwpFacA = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(0, 0, 0, 1)); + __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA); + + __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1)); + __m128 SubFacB = _mm_shuffle_ps(SubTmpB, SubTmpB, _MM_SHUFFLE(3, 1, 1, 0));//SubF[0], SubE[3], SubE[3], SubE[1]; + __m128 SwpFacB = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(1, 1, 2, 2)); + __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB); + + __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB); + + __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2)); + __m128 SubFacC = _mm_shuffle_ps(SubTmpC, SubTmpC, _MM_SHUFFLE(3, 3, 2, 0)); + __m128 SwpFacC = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(2, 3, 3, 3)); + __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC); + + __m128 AddRes = _mm_add_ps(SubRes, MulFacC); + __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f)); + + //return m[0][0] * DetCof[0] + // + m[0][1] * DetCof[1] + // + m[0][2] * DetCof[2] + // + m[0][3] * DetCof[3]; + + return glm_vec4_dot(m[0], DetCof); +} + +GLM_FUNC_QUALIFIER void glm_mat4_inverse(glm_vec4 const in[4], glm_vec4 out[4]) +{ + __m128 Fac0; + { + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac0 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac1; + { + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac1 = _mm_sub_ps(Mul00, Mul01); + } + + + __m128 Fac2; + { + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac2 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac3; + { + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac3 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac4; + { + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac4 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac5; + { + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac5 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f); + __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f); + + // m[1][0] + // m[0][0] + // m[0][0] + // m[0][0] + __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][1] + // m[0][1] + // m[0][1] + // m[0][1] + __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][2] + // m[0][2] + // m[0][2] + // m[0][2] + __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][3] + // m[0][3] + // m[0][3] + // m[0][3] + __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0)); + + // col0 + // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]), + // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]), + // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]), + // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]), + __m128 Mul00 = _mm_mul_ps(Vec1, Fac0); + __m128 Mul01 = _mm_mul_ps(Vec2, Fac1); + __m128 Mul02 = _mm_mul_ps(Vec3, Fac2); + __m128 Sub00 = _mm_sub_ps(Mul00, Mul01); + __m128 Add00 = _mm_add_ps(Sub00, Mul02); + __m128 Inv0 = _mm_mul_ps(SignB, Add00); + + // col1 + // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]), + // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]), + // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]), + // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]), + __m128 Mul03 = _mm_mul_ps(Vec0, Fac0); + __m128 Mul04 = _mm_mul_ps(Vec2, Fac3); + __m128 Mul05 = _mm_mul_ps(Vec3, Fac4); + __m128 Sub01 = _mm_sub_ps(Mul03, Mul04); + __m128 Add01 = _mm_add_ps(Sub01, Mul05); + __m128 Inv1 = _mm_mul_ps(SignA, Add01); + + // col2 + // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]), + // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]), + // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]), + // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]), + __m128 Mul06 = _mm_mul_ps(Vec0, Fac1); + __m128 Mul07 = _mm_mul_ps(Vec1, Fac3); + __m128 Mul08 = _mm_mul_ps(Vec3, Fac5); + __m128 Sub02 = _mm_sub_ps(Mul06, Mul07); + __m128 Add02 = _mm_add_ps(Sub02, Mul08); + __m128 Inv2 = _mm_mul_ps(SignB, Add02); + + // col3 + // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]), + // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]), + // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]), + // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3])); + __m128 Mul09 = _mm_mul_ps(Vec0, Fac2); + __m128 Mul10 = _mm_mul_ps(Vec1, Fac4); + __m128 Mul11 = _mm_mul_ps(Vec2, Fac5); + __m128 Sub03 = _mm_sub_ps(Mul09, Mul10); + __m128 Add03 = _mm_add_ps(Sub03, Mul11); + __m128 Inv3 = _mm_mul_ps(SignA, Add03); + + __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); + + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] + // + m[0][3] * Inverse[3][0]; + __m128 Det0 = glm_vec4_dot(in[0], Row2); + __m128 Rcp0 = _mm_div_ps(_mm_set1_ps(1.0f), Det0); + //__m128 Rcp0 = _mm_rcp_ps(Det0); + + // Inverse /= Determinant; + out[0] = _mm_mul_ps(Inv0, Rcp0); + out[1] = _mm_mul_ps(Inv1, Rcp0); + out[2] = _mm_mul_ps(Inv2, Rcp0); + out[3] = _mm_mul_ps(Inv3, Rcp0); +} + +GLM_FUNC_QUALIFIER void glm_mat4_inverse_lowp(glm_vec4 const in[4], glm_vec4 out[4]) +{ + __m128 Fac0; + { + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac0 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac1; + { + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac1 = _mm_sub_ps(Mul00, Mul01); + } + + + __m128 Fac2; + { + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac2 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac3; + { + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac3 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac4; + { + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac4 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac5; + { + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac5 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f); + __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f); + + // m[1][0] + // m[0][0] + // m[0][0] + // m[0][0] + __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][1] + // m[0][1] + // m[0][1] + // m[0][1] + __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][2] + // m[0][2] + // m[0][2] + // m[0][2] + __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][3] + // m[0][3] + // m[0][3] + // m[0][3] + __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0)); + + // col0 + // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]), + // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]), + // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]), + // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]), + __m128 Mul00 = _mm_mul_ps(Vec1, Fac0); + __m128 Mul01 = _mm_mul_ps(Vec2, Fac1); + __m128 Mul02 = _mm_mul_ps(Vec3, Fac2); + __m128 Sub00 = _mm_sub_ps(Mul00, Mul01); + __m128 Add00 = _mm_add_ps(Sub00, Mul02); + __m128 Inv0 = _mm_mul_ps(SignB, Add00); + + // col1 + // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]), + // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]), + // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]), + // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]), + __m128 Mul03 = _mm_mul_ps(Vec0, Fac0); + __m128 Mul04 = _mm_mul_ps(Vec2, Fac3); + __m128 Mul05 = _mm_mul_ps(Vec3, Fac4); + __m128 Sub01 = _mm_sub_ps(Mul03, Mul04); + __m128 Add01 = _mm_add_ps(Sub01, Mul05); + __m128 Inv1 = _mm_mul_ps(SignA, Add01); + + // col2 + // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]), + // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]), + // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]), + // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]), + __m128 Mul06 = _mm_mul_ps(Vec0, Fac1); + __m128 Mul07 = _mm_mul_ps(Vec1, Fac3); + __m128 Mul08 = _mm_mul_ps(Vec3, Fac5); + __m128 Sub02 = _mm_sub_ps(Mul06, Mul07); + __m128 Add02 = _mm_add_ps(Sub02, Mul08); + __m128 Inv2 = _mm_mul_ps(SignB, Add02); + + // col3 + // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]), + // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]), + // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]), + // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3])); + __m128 Mul09 = _mm_mul_ps(Vec0, Fac2); + __m128 Mul10 = _mm_mul_ps(Vec1, Fac4); + __m128 Mul11 = _mm_mul_ps(Vec2, Fac5); + __m128 Sub03 = _mm_sub_ps(Mul09, Mul10); + __m128 Add03 = _mm_add_ps(Sub03, Mul11); + __m128 Inv3 = _mm_mul_ps(SignA, Add03); + + __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); + + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] + // + m[0][3] * Inverse[3][0]; + __m128 Det0 = glm_vec4_dot(in[0], Row2); + __m128 Rcp0 = _mm_rcp_ps(Det0); + //__m128 Rcp0 = _mm_div_ps(one, Det0); + // Inverse /= Determinant; + out[0] = _mm_mul_ps(Inv0, Rcp0); + out[1] = _mm_mul_ps(Inv1, Rcp0); + out[2] = _mm_mul_ps(Inv2, Rcp0); + out[3] = _mm_mul_ps(Inv3, Rcp0); +} +/* +GLM_FUNC_QUALIFIER void glm_mat4_rotate(__m128 const in[4], float Angle, float const v[3], __m128 out[4]) +{ + float a = glm::radians(Angle); + float c = cos(a); + float s = sin(a); + + glm::vec4 AxisA(v[0], v[1], v[2], float(0)); + __m128 AxisB = _mm_set_ps(AxisA.w, AxisA.z, AxisA.y, AxisA.x); + __m128 AxisC = detail::sse_nrm_ps(AxisB); + + __m128 Cos0 = _mm_set_ss(c); + __m128 CosA = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Sin0 = _mm_set_ss(s); + __m128 SinA = _mm_shuffle_ps(Sin0, Sin0, _MM_SHUFFLE(0, 0, 0, 0)); + + // vec<3, T, Q> temp = (valType(1) - c) * axis; + __m128 Temp0 = _mm_sub_ps(one, CosA); + __m128 Temp1 = _mm_mul_ps(Temp0, AxisC); + + //Rotate[0][0] = c + temp[0] * axis[0]; + //Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2]; + //Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1]; + __m128 Axis0 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 TmpA0 = _mm_mul_ps(Axis0, AxisC); + __m128 CosA0 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 1, 0)); + __m128 TmpA1 = _mm_add_ps(CosA0, TmpA0); + __m128 SinA0 = SinA;//_mm_set_ps(0.0f, s, -s, 0.0f); + __m128 TmpA2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 1, 2, 3)); + __m128 TmpA3 = _mm_mul_ps(SinA0, TmpA2); + __m128 TmpA4 = _mm_add_ps(TmpA1, TmpA3); + + //Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2]; + //Rotate[1][1] = c + temp[1] * axis[1]; + //Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0]; + __m128 Axis1 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(1, 1, 1, 1)); + __m128 TmpB0 = _mm_mul_ps(Axis1, AxisC); + __m128 CosA1 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 0, 1)); + __m128 TmpB1 = _mm_add_ps(CosA1, TmpB0); + __m128 SinB0 = SinA;//_mm_set_ps(-s, 0.0f, s, 0.0f); + __m128 TmpB2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 0, 3, 2)); + __m128 TmpB3 = _mm_mul_ps(SinA0, TmpB2); + __m128 TmpB4 = _mm_add_ps(TmpB1, TmpB3); + + //Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1]; + //Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0]; + //Rotate[2][2] = c + temp[2] * axis[2]; + __m128 Axis2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 TmpC0 = _mm_mul_ps(Axis2, AxisC); + __m128 CosA2 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 0, 1, 1)); + __m128 TmpC1 = _mm_add_ps(CosA2, TmpC0); + __m128 SinC0 = SinA;//_mm_set_ps(s, -s, 0.0f, 0.0f); + __m128 TmpC2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 3, 0, 1)); + __m128 TmpC3 = _mm_mul_ps(SinA0, TmpC2); + __m128 TmpC4 = _mm_add_ps(TmpC1, TmpC3); + + __m128 Result[4]; + Result[0] = TmpA4; + Result[1] = TmpB4; + Result[2] = TmpC4; + Result[3] = _mm_set_ps(1, 0, 0, 0); + + //mat<4, 4, valType> Result; + //Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; + //Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; + //Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; + //Result[3] = m[3]; + //return Result; + sse_mul_ps(in, Result, out); +} +*/ +GLM_FUNC_QUALIFIER void glm_mat4_outerProduct(__m128 const& c, __m128 const& r, __m128 out[4]) +{ + out[0] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(0, 0, 0, 0))); + out[1] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(1, 1, 1, 1))); + out[2] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(2, 2, 2, 2))); + out[3] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(3, 3, 3, 3))); +} + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/simd/neon.h b/NothinFancy/dep/include/glm/simd/neon.h new file mode 100644 index 0000000..6c38b06 --- /dev/null +++ b/NothinFancy/dep/include/glm/simd/neon.h @@ -0,0 +1,155 @@ +/// @ref simd_neon +/// @file glm/simd/neon.h + +#pragma once + +#if GLM_ARCH & GLM_ARCH_NEON_BIT +#include + +namespace glm { + namespace neon { + static float32x4_t dupq_lane(float32x4_t vsrc, int lane) { + switch(lane) { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + case 0: return vdupq_laneq_f32(vsrc, 0); + case 1: return vdupq_laneq_f32(vsrc, 1); + case 2: return vdupq_laneq_f32(vsrc, 2); + case 3: return vdupq_laneq_f32(vsrc, 3); +#else + case 0: return vdupq_n_f32(vgetq_lane_f32(vsrc, 0)); + case 1: return vdupq_n_f32(vgetq_lane_f32(vsrc, 1)); + case 2: return vdupq_n_f32(vgetq_lane_f32(vsrc, 2)); + case 3: return vdupq_n_f32(vgetq_lane_f32(vsrc, 3)); +#endif + } + assert(!"Unreachable code executed!"); + return vdupq_n_f32(0.0f); + } + + static float32x2_t dup_lane(float32x4_t vsrc, int lane) { + switch(lane) { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + case 0: return vdup_laneq_f32(vsrc, 0); + case 1: return vdup_laneq_f32(vsrc, 1); + case 2: return vdup_laneq_f32(vsrc, 2); + case 3: return vdup_laneq_f32(vsrc, 3); +#else + case 0: return vdup_n_f32(vgetq_lane_f32(vsrc, 0)); + case 1: return vdup_n_f32(vgetq_lane_f32(vsrc, 1)); + case 2: return vdup_n_f32(vgetq_lane_f32(vsrc, 2)); + case 3: return vdup_n_f32(vgetq_lane_f32(vsrc, 3)); +#endif + } + assert(!"Unreachable code executed!"); + return vdup_n_f32(0.0f); + } + + static float32x4_t copy_lane(float32x4_t vdst, int dlane, float32x4_t vsrc, int slane) { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + switch(dlane) { + case 0: + switch(slane) { + case 0: return vcopyq_laneq_f32(vdst, 0, vsrc, 0); + case 1: return vcopyq_laneq_f32(vdst, 0, vsrc, 1); + case 2: return vcopyq_laneq_f32(vdst, 0, vsrc, 2); + case 3: return vcopyq_laneq_f32(vdst, 0, vsrc, 3); + } + assert(!"Unreachable code executed!"); + case 1: + switch(slane) { + case 0: return vcopyq_laneq_f32(vdst, 1, vsrc, 0); + case 1: return vcopyq_laneq_f32(vdst, 1, vsrc, 1); + case 2: return vcopyq_laneq_f32(vdst, 1, vsrc, 2); + case 3: return vcopyq_laneq_f32(vdst, 1, vsrc, 3); + } + assert(!"Unreachable code executed!"); + case 2: + switch(slane) { + case 0: return vcopyq_laneq_f32(vdst, 2, vsrc, 0); + case 1: return vcopyq_laneq_f32(vdst, 2, vsrc, 1); + case 2: return vcopyq_laneq_f32(vdst, 2, vsrc, 2); + case 3: return vcopyq_laneq_f32(vdst, 2, vsrc, 3); + } + assert(!"Unreachable code executed!"); + case 3: + switch(slane) { + case 0: return vcopyq_laneq_f32(vdst, 3, vsrc, 0); + case 1: return vcopyq_laneq_f32(vdst, 3, vsrc, 1); + case 2: return vcopyq_laneq_f32(vdst, 3, vsrc, 2); + case 3: return vcopyq_laneq_f32(vdst, 3, vsrc, 3); + } + assert(!"Unreachable code executed!"); + } +#else + + float l; + switch(slane) { + case 0: l = vgetq_lane_f32(vsrc, 0); break; + case 1: l = vgetq_lane_f32(vsrc, 1); break; + case 2: l = vgetq_lane_f32(vsrc, 2); break; + case 3: l = vgetq_lane_f32(vsrc, 3); break; + default: + assert(!"Unreachable code executed!"); + } + switch(dlane) { + case 0: return vsetq_lane_f32(l, vdst, 0); + case 1: return vsetq_lane_f32(l, vdst, 1); + case 2: return vsetq_lane_f32(l, vdst, 2); + case 3: return vsetq_lane_f32(l, vdst, 3); + } +#endif + assert(!"Unreachable code executed!"); + return vdupq_n_f32(0.0f); + } + + static float32x4_t mul_lane(float32x4_t v, float32x4_t vlane, int lane) { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + switch(lane) { + case 0: return vmulq_laneq_f32(v, vlane, 0); break; + case 1: return vmulq_laneq_f32(v, vlane, 1); break; + case 2: return vmulq_laneq_f32(v, vlane, 2); break; + case 3: return vmulq_laneq_f32(v, vlane, 3); break; + default: + assert(!"Unreachable code executed!"); + } + assert(!"Unreachable code executed!"); + return vdupq_n_f32(0.0f); +#else + return vmulq_f32(v, dupq_lane(vlane, lane)); +#endif + } + + static float32x4_t madd_lane(float32x4_t acc, float32x4_t v, float32x4_t vlane, int lane) { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT +#ifdef GLM_CONFIG_FORCE_FMA +# define FMADD_LANE(acc, x, y, L) do { asm volatile ("fmla %0.4s, %1.4s, %2.4s" : "+w"(acc) : "w"(x), "w"(dup_lane(y, L))); } while(0) +#else +# define FMADD_LANE(acc, x, y, L) do { acc = vmlaq_laneq_f32(acc, x, y, L); } while(0) +#endif + + switch(lane) { + case 0: + FMADD_LANE(acc, v, vlane, 0); + return acc; + case 1: + FMADD_LANE(acc, v, vlane, 1); + return acc; + case 2: + FMADD_LANE(acc, v, vlane, 2); + return acc; + case 3: + FMADD_LANE(acc, v, vlane, 3); + return acc; + default: + assert(!"Unreachable code executed!"); + } + assert(!"Unreachable code executed!"); + return vdupq_n_f32(0.0f); +# undef FMADD_LANE +#else + return vaddq_f32(acc, vmulq_f32(v, dupq_lane(vlane, lane))); +#endif + } + } //namespace neon +} // namespace glm +#endif // GLM_ARCH & GLM_ARCH_NEON_BIT diff --git a/NothinFancy/dep/include/glm/simd/packing.h b/NothinFancy/dep/include/glm/simd/packing.h new file mode 100644 index 0000000..609163e --- /dev/null +++ b/NothinFancy/dep/include/glm/simd/packing.h @@ -0,0 +1,8 @@ +/// @ref simd +/// @file glm/simd/packing.h + +#pragma once + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/simd/platform.h b/NothinFancy/dep/include/glm/simd/platform.h new file mode 100644 index 0000000..ad25cc1 --- /dev/null +++ b/NothinFancy/dep/include/glm/simd/platform.h @@ -0,0 +1,398 @@ +#pragma once + +/////////////////////////////////////////////////////////////////////////////////// +// Platform + +#define GLM_PLATFORM_UNKNOWN 0x00000000 +#define GLM_PLATFORM_WINDOWS 0x00010000 +#define GLM_PLATFORM_LINUX 0x00020000 +#define GLM_PLATFORM_APPLE 0x00040000 +//#define GLM_PLATFORM_IOS 0x00080000 +#define GLM_PLATFORM_ANDROID 0x00100000 +#define GLM_PLATFORM_CHROME_NACL 0x00200000 +#define GLM_PLATFORM_UNIX 0x00400000 +#define GLM_PLATFORM_QNXNTO 0x00800000 +#define GLM_PLATFORM_WINCE 0x01000000 +#define GLM_PLATFORM_CYGWIN 0x02000000 + +#ifdef GLM_FORCE_PLATFORM_UNKNOWN +# define GLM_PLATFORM GLM_PLATFORM_UNKNOWN +#elif defined(__CYGWIN__) +# define GLM_PLATFORM GLM_PLATFORM_CYGWIN +#elif defined(__QNXNTO__) +# define GLM_PLATFORM GLM_PLATFORM_QNXNTO +#elif defined(__APPLE__) +# define GLM_PLATFORM GLM_PLATFORM_APPLE +#elif defined(WINCE) +# define GLM_PLATFORM GLM_PLATFORM_WINCE +#elif defined(_WIN32) +# define GLM_PLATFORM GLM_PLATFORM_WINDOWS +#elif defined(__native_client__) +# define GLM_PLATFORM GLM_PLATFORM_CHROME_NACL +#elif defined(__ANDROID__) +# define GLM_PLATFORM GLM_PLATFORM_ANDROID +#elif defined(__linux) +# define GLM_PLATFORM GLM_PLATFORM_LINUX +#elif defined(__unix) +# define GLM_PLATFORM GLM_PLATFORM_UNIX +#else +# define GLM_PLATFORM GLM_PLATFORM_UNKNOWN +#endif// + +/////////////////////////////////////////////////////////////////////////////////// +// Compiler + +#define GLM_COMPILER_UNKNOWN 0x00000000 + +// Intel +#define GLM_COMPILER_INTEL 0x00100000 +#define GLM_COMPILER_INTEL14 0x00100040 +#define GLM_COMPILER_INTEL15 0x00100050 +#define GLM_COMPILER_INTEL16 0x00100060 +#define GLM_COMPILER_INTEL17 0x00100070 + +// Visual C++ defines +#define GLM_COMPILER_VC 0x01000000 +#define GLM_COMPILER_VC12 0x01000001 +#define GLM_COMPILER_VC14 0x01000002 +#define GLM_COMPILER_VC15 0x01000003 +#define GLM_COMPILER_VC15_3 0x01000004 +#define GLM_COMPILER_VC15_5 0x01000005 +#define GLM_COMPILER_VC15_6 0x01000006 +#define GLM_COMPILER_VC15_7 0x01000007 +#define GLM_COMPILER_VC15_8 0x01000008 +#define GLM_COMPILER_VC15_9 0x01000009 +#define GLM_COMPILER_VC16 0x0100000A + +// GCC defines +#define GLM_COMPILER_GCC 0x02000000 +#define GLM_COMPILER_GCC46 0x020000D0 +#define GLM_COMPILER_GCC47 0x020000E0 +#define GLM_COMPILER_GCC48 0x020000F0 +#define GLM_COMPILER_GCC49 0x02000100 +#define GLM_COMPILER_GCC5 0x02000200 +#define GLM_COMPILER_GCC6 0x02000300 +#define GLM_COMPILER_GCC7 0x02000400 +#define GLM_COMPILER_GCC8 0x02000500 + +// CUDA +#define GLM_COMPILER_CUDA 0x10000000 +#define GLM_COMPILER_CUDA75 0x10000001 +#define GLM_COMPILER_CUDA80 0x10000002 +#define GLM_COMPILER_CUDA90 0x10000004 + +// SYCL +#define GLM_COMPILER_SYCL 0x00300000 + +// Clang +#define GLM_COMPILER_CLANG 0x20000000 +#define GLM_COMPILER_CLANG34 0x20000050 +#define GLM_COMPILER_CLANG35 0x20000060 +#define GLM_COMPILER_CLANG36 0x20000070 +#define GLM_COMPILER_CLANG37 0x20000080 +#define GLM_COMPILER_CLANG38 0x20000090 +#define GLM_COMPILER_CLANG39 0x200000A0 +#define GLM_COMPILER_CLANG40 0x200000B0 +#define GLM_COMPILER_CLANG41 0x200000C0 +#define GLM_COMPILER_CLANG42 0x200000D0 + +// Build model +#define GLM_MODEL_32 0x00000010 +#define GLM_MODEL_64 0x00000020 + +// Force generic C++ compiler +#ifdef GLM_FORCE_COMPILER_UNKNOWN +# define GLM_COMPILER GLM_COMPILER_UNKNOWN + +#elif defined(__INTEL_COMPILER) +# if __INTEL_COMPILER >= 1700 +# define GLM_COMPILER GLM_COMPILER_INTEL17 +# elif __INTEL_COMPILER >= 1600 +# define GLM_COMPILER GLM_COMPILER_INTEL16 +# elif __INTEL_COMPILER >= 1500 +# define GLM_COMPILER GLM_COMPILER_INTEL15 +# elif __INTEL_COMPILER >= 1400 +# define GLM_COMPILER GLM_COMPILER_INTEL14 +# elif __INTEL_COMPILER < 1400 +# error "GLM requires ICC 2013 SP1 or newer" +# endif + +// CUDA +#elif defined(__CUDACC__) +# if !defined(CUDA_VERSION) && !defined(GLM_FORCE_CUDA) +# include // make sure version is defined since nvcc does not define it itself! +# endif +# if CUDA_VERSION >= 8000 +# define GLM_COMPILER GLM_COMPILER_CUDA80 +# elif CUDA_VERSION >= 7500 +# define GLM_COMPILER GLM_COMPILER_CUDA75 +# elif CUDA_VERSION >= 7000 +# define GLM_COMPILER GLM_COMPILER_CUDA70 +# elif CUDA_VERSION < 7000 +# error "GLM requires CUDA 7.0 or higher" +# endif + +// SYCL +#elif defined(__SYCL_DEVICE_ONLY__) +# define GLM_COMPILER GLM_COMPILER_SYCL + +// Clang +#elif defined(__clang__) +# if defined(__apple_build_version__) +# if (__clang_major__ < 6) +# error "GLM requires Clang 3.4 / Apple Clang 6.0 or higher" +# elif __clang_major__ == 6 && __clang_minor__ == 0 +# define GLM_COMPILER GLM_COMPILER_CLANG35 +# elif __clang_major__ == 6 && __clang_minor__ >= 1 +# define GLM_COMPILER GLM_COMPILER_CLANG36 +# elif __clang_major__ >= 7 +# define GLM_COMPILER GLM_COMPILER_CLANG37 +# endif +# else +# if ((__clang_major__ == 3) && (__clang_minor__ < 4)) || (__clang_major__ < 3) +# error "GLM requires Clang 3.4 or higher" +# elif __clang_major__ == 3 && __clang_minor__ == 4 +# define GLM_COMPILER GLM_COMPILER_CLANG34 +# elif __clang_major__ == 3 && __clang_minor__ == 5 +# define GLM_COMPILER GLM_COMPILER_CLANG35 +# elif __clang_major__ == 3 && __clang_minor__ == 6 +# define GLM_COMPILER GLM_COMPILER_CLANG36 +# elif __clang_major__ == 3 && __clang_minor__ == 7 +# define GLM_COMPILER GLM_COMPILER_CLANG37 +# elif __clang_major__ == 3 && __clang_minor__ == 8 +# define GLM_COMPILER GLM_COMPILER_CLANG38 +# elif __clang_major__ == 3 && __clang_minor__ >= 9 +# define GLM_COMPILER GLM_COMPILER_CLANG39 +# elif __clang_major__ == 4 && __clang_minor__ == 0 +# define GLM_COMPILER GLM_COMPILER_CLANG40 +# elif __clang_major__ == 4 && __clang_minor__ == 1 +# define GLM_COMPILER GLM_COMPILER_CLANG41 +# elif __clang_major__ == 4 && __clang_minor__ >= 2 +# define GLM_COMPILER GLM_COMPILER_CLANG42 +# elif __clang_major__ >= 4 +# define GLM_COMPILER GLM_COMPILER_CLANG42 +# endif +# endif + +// Visual C++ +#elif defined(_MSC_VER) +# if _MSC_VER >= 1920 +# define GLM_COMPILER GLM_COMPILER_VC16 +# elif _MSC_VER >= 1916 +# define GLM_COMPILER GLM_COMPILER_VC15_9 +# elif _MSC_VER >= 1915 +# define GLM_COMPILER GLM_COMPILER_VC15_8 +# elif _MSC_VER >= 1914 +# define GLM_COMPILER GLM_COMPILER_VC15_7 +# elif _MSC_VER >= 1913 +# define GLM_COMPILER GLM_COMPILER_VC15_6 +# elif _MSC_VER >= 1912 +# define GLM_COMPILER GLM_COMPILER_VC15_5 +# elif _MSC_VER >= 1911 +# define GLM_COMPILER GLM_COMPILER_VC15_3 +# elif _MSC_VER >= 1910 +# define GLM_COMPILER GLM_COMPILER_VC15 +# elif _MSC_VER >= 1900 +# define GLM_COMPILER GLM_COMPILER_VC14 +# elif _MSC_VER >= 1800 +# define GLM_COMPILER GLM_COMPILER_VC12 +# elif _MSC_VER < 1800 +# error "GLM requires Visual C++ 12 - 2013 or higher" +# endif//_MSC_VER + +// G++ +#elif defined(__GNUC__) || defined(__MINGW32__) +# if __GNUC__ >= 8 +# define GLM_COMPILER GLM_COMPILER_GCC8 +# elif __GNUC__ >= 7 +# define GLM_COMPILER GLM_COMPILER_GCC7 +# elif __GNUC__ >= 6 +# define GLM_COMPILER GLM_COMPILER_GCC6 +# elif __GNUC__ >= 5 +# define GLM_COMPILER GLM_COMPILER_GCC5 +# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 9 +# define GLM_COMPILER GLM_COMPILER_GCC49 +# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 8 +# define GLM_COMPILER GLM_COMPILER_GCC48 +# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 7 +# define GLM_COMPILER GLM_COMPILER_GCC47 +# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 6 +# define GLM_COMPILER GLM_COMPILER_GCC46 +# elif ((__GNUC__ == 4) && (__GNUC_MINOR__ < 6)) || (__GNUC__ < 4) +# error "GLM requires GCC 4.6 or higher" +# endif + +#else +# define GLM_COMPILER GLM_COMPILER_UNKNOWN +#endif + +#ifndef GLM_COMPILER +# error "GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message." +#endif//GLM_COMPILER + +/////////////////////////////////////////////////////////////////////////////////// +// Instruction sets + +// User defines: GLM_FORCE_PURE GLM_FORCE_INTRINSICS GLM_FORCE_SSE2 GLM_FORCE_SSE3 GLM_FORCE_AVX GLM_FORCE_AVX2 GLM_FORCE_AVX2 + +#define GLM_ARCH_MIPS_BIT (0x10000000) +#define GLM_ARCH_PPC_BIT (0x20000000) +#define GLM_ARCH_ARM_BIT (0x40000000) +#define GLM_ARCH_ARMV8_BIT (0x01000000) +#define GLM_ARCH_X86_BIT (0x80000000) + +#define GLM_ARCH_SIMD_BIT (0x00001000) + +#define GLM_ARCH_NEON_BIT (0x00000001) +#define GLM_ARCH_SSE_BIT (0x00000002) +#define GLM_ARCH_SSE2_BIT (0x00000004) +#define GLM_ARCH_SSE3_BIT (0x00000008) +#define GLM_ARCH_SSSE3_BIT (0x00000010) +#define GLM_ARCH_SSE41_BIT (0x00000020) +#define GLM_ARCH_SSE42_BIT (0x00000040) +#define GLM_ARCH_AVX_BIT (0x00000080) +#define GLM_ARCH_AVX2_BIT (0x00000100) + +#define GLM_ARCH_UNKNOWN (0) +#define GLM_ARCH_X86 (GLM_ARCH_X86_BIT) +#define GLM_ARCH_SSE (GLM_ARCH_SSE_BIT | GLM_ARCH_SIMD_BIT | GLM_ARCH_X86) +#define GLM_ARCH_SSE2 (GLM_ARCH_SSE2_BIT | GLM_ARCH_SSE) +#define GLM_ARCH_SSE3 (GLM_ARCH_SSE3_BIT | GLM_ARCH_SSE2) +#define GLM_ARCH_SSSE3 (GLM_ARCH_SSSE3_BIT | GLM_ARCH_SSE3) +#define GLM_ARCH_SSE41 (GLM_ARCH_SSE41_BIT | GLM_ARCH_SSSE3) +#define GLM_ARCH_SSE42 (GLM_ARCH_SSE42_BIT | GLM_ARCH_SSE41) +#define GLM_ARCH_AVX (GLM_ARCH_AVX_BIT | GLM_ARCH_SSE42) +#define GLM_ARCH_AVX2 (GLM_ARCH_AVX2_BIT | GLM_ARCH_AVX) +#define GLM_ARCH_ARM (GLM_ARCH_ARM_BIT) +#define GLM_ARCH_ARMV8 (GLM_ARCH_NEON_BIT | GLM_ARCH_SIMD_BIT | GLM_ARCH_ARM | GLM_ARCH_ARMV8_BIT) +#define GLM_ARCH_NEON (GLM_ARCH_NEON_BIT | GLM_ARCH_SIMD_BIT | GLM_ARCH_ARM) +#define GLM_ARCH_MIPS (GLM_ARCH_MIPS_BIT) +#define GLM_ARCH_PPC (GLM_ARCH_PPC_BIT) + +#if defined(GLM_FORCE_ARCH_UNKNOWN) || defined(GLM_FORCE_PURE) +# define GLM_ARCH GLM_ARCH_UNKNOWN +#elif defined(GLM_FORCE_NEON) +# if __ARM_ARCH >= 8 +# define GLM_ARCH (GLM_ARCH_ARMV8) +# else +# define GLM_ARCH (GLM_ARCH_NEON) +# endif +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_AVX2) +# define GLM_ARCH (GLM_ARCH_AVX2) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_AVX) +# define GLM_ARCH (GLM_ARCH_AVX) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSE42) +# define GLM_ARCH (GLM_ARCH_SSE42) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSE41) +# define GLM_ARCH (GLM_ARCH_SSE41) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSSE3) +# define GLM_ARCH (GLM_ARCH_SSSE3) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSE3) +# define GLM_ARCH (GLM_ARCH_SSE3) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSE2) +# define GLM_ARCH (GLM_ARCH_SSE2) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSE) +# define GLM_ARCH (GLM_ARCH_SSE) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_INTRINSICS) && !defined(GLM_FORCE_XYZW_ONLY) +# if defined(__AVX2__) +# define GLM_ARCH (GLM_ARCH_AVX2) +# elif defined(__AVX__) +# define GLM_ARCH (GLM_ARCH_AVX) +# elif defined(__SSE4_2__) +# define GLM_ARCH (GLM_ARCH_SSE42) +# elif defined(__SSE4_1__) +# define GLM_ARCH (GLM_ARCH_SSE41) +# elif defined(__SSSE3__) +# define GLM_ARCH (GLM_ARCH_SSSE3) +# elif defined(__SSE3__) +# define GLM_ARCH (GLM_ARCH_SSE3) +# elif defined(__SSE2__) || defined(__x86_64__) || defined(_M_X64) || defined(_M_IX86_FP) +# define GLM_ARCH (GLM_ARCH_SSE2) +# elif defined(__i386__) +# define GLM_ARCH (GLM_ARCH_X86) +# elif defined(__ARM_ARCH) && (__ARM_ARCH >= 8) +# define GLM_ARCH (GLM_ARCH_ARMV8) +# elif defined(__ARM_NEON) +# define GLM_ARCH (GLM_ARCH_ARM | GLM_ARCH_NEON) +# elif defined(__arm__ ) || defined(_M_ARM) +# define GLM_ARCH (GLM_ARCH_ARM) +# elif defined(__mips__ ) +# define GLM_ARCH (GLM_ARCH_MIPS) +# elif defined(__powerpc__ ) || defined(_M_PPC) +# define GLM_ARCH (GLM_ARCH_PPC) +# else +# define GLM_ARCH (GLM_ARCH_UNKNOWN) +# endif +#else +# if defined(__x86_64__) || defined(_M_X64) || defined(_M_IX86) || defined(__i386__) +# define GLM_ARCH (GLM_ARCH_X86) +# elif defined(__arm__) || defined(_M_ARM) +# define GLM_ARCH (GLM_ARCH_ARM) +# elif defined(__powerpc__) || defined(_M_PPC) +# define GLM_ARCH (GLM_ARCH_PPC) +# elif defined(__mips__) +# define GLM_ARCH (GLM_ARCH_MIPS) +# else +# define GLM_ARCH (GLM_ARCH_UNKNOWN) +# endif +#endif + +#if GLM_ARCH & GLM_ARCH_AVX2_BIT +# include +#elif GLM_ARCH & GLM_ARCH_AVX_BIT +# include +#elif GLM_ARCH & GLM_ARCH_SSE42_BIT +# if GLM_COMPILER & GLM_COMPILER_CLANG +# include +# endif +# include +#elif GLM_ARCH & GLM_ARCH_SSE41_BIT +# include +#elif GLM_ARCH & GLM_ARCH_SSSE3_BIT +# include +#elif GLM_ARCH & GLM_ARCH_SSE3_BIT +# include +#elif GLM_ARCH & GLM_ARCH_SSE2_BIT +# include +#elif GLM_ARCH & GLM_ARCH_NEON_BIT +# include "neon.h" +#endif//GLM_ARCH + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + typedef __m128 glm_f32vec4; + typedef __m128i glm_i32vec4; + typedef __m128i glm_u32vec4; + typedef __m128d glm_f64vec2; + typedef __m128i glm_i64vec2; + typedef __m128i glm_u64vec2; + + typedef glm_f32vec4 glm_vec4; + typedef glm_i32vec4 glm_ivec4; + typedef glm_u32vec4 glm_uvec4; + typedef glm_f64vec2 glm_dvec2; +#endif + +#if GLM_ARCH & GLM_ARCH_AVX_BIT + typedef __m256d glm_f64vec4; + typedef glm_f64vec4 glm_dvec4; +#endif + +#if GLM_ARCH & GLM_ARCH_AVX2_BIT + typedef __m256i glm_i64vec4; + typedef __m256i glm_u64vec4; +#endif + +#if GLM_ARCH & GLM_ARCH_NEON_BIT + typedef float32x4_t glm_f32vec4; + typedef int32x4_t glm_i32vec4; + typedef uint32x4_t glm_u32vec4; +#endif diff --git a/NothinFancy/dep/include/glm/simd/trigonometric.h b/NothinFancy/dep/include/glm/simd/trigonometric.h new file mode 100644 index 0000000..739b796 --- /dev/null +++ b/NothinFancy/dep/include/glm/simd/trigonometric.h @@ -0,0 +1,9 @@ +/// @ref simd +/// @file glm/simd/trigonometric.h + +#pragma once + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT + diff --git a/NothinFancy/dep/include/glm/simd/vector_relational.h b/NothinFancy/dep/include/glm/simd/vector_relational.h new file mode 100644 index 0000000..f7385e9 --- /dev/null +++ b/NothinFancy/dep/include/glm/simd/vector_relational.h @@ -0,0 +1,8 @@ +/// @ref simd +/// @file glm/simd/vector_relational.h + +#pragma once + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/NothinFancy/dep/include/glm/trigonometric.hpp b/NothinFancy/dep/include/glm/trigonometric.hpp new file mode 100644 index 0000000..fcf07f8 --- /dev/null +++ b/NothinFancy/dep/include/glm/trigonometric.hpp @@ -0,0 +1,210 @@ +/// @ref core +/// @file glm/trigonometric.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions +/// +/// @defgroup core_func_trigonometric Angle and Trigonometry Functions +/// @ingroup core +/// +/// Function parameters specified as angle are assumed to be in units of radians. +/// In no case will any of these functions result in a divide by zero error. If +/// the divisor of a ratio is 0, then results will be undefined. +/// +/// These all operate component-wise. The description is per component. +/// +/// Include to use these core features. +/// +/// @see ext_vector_trigonometric + +#pragma once + +#include "detail/setup.hpp" +#include "detail/qualifier.hpp" + +namespace glm +{ + /// @addtogroup core_func_trigonometric + /// @{ + + /// Converts degrees to radians and returns the result. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL radians man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec radians(vec const& degrees); + + /// Converts radians to degrees and returns the result. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL degrees man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec degrees(vec const& radians); + + /// The standard trigonometric sine function. + /// The values returned by this function will range from [-1, 1]. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL sin man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec sin(vec const& angle); + + /// The standard trigonometric cosine function. + /// The values returned by this function will range from [-1, 1]. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL cos man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec cos(vec const& angle); + + /// The standard trigonometric tangent function. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL tan man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec tan(vec const& angle); + + /// Arc sine. Returns an angle whose sine is x. + /// The range of values returned by this function is [-PI/2, PI/2]. + /// Results are undefined if |x| > 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL asin man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec asin(vec const& x); + + /// Arc cosine. Returns an angle whose sine is x. + /// The range of values returned by this function is [0, PI]. + /// Results are undefined if |x| > 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL acos man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec acos(vec const& x); + + /// Arc tangent. Returns an angle whose tangent is y/x. + /// The signs of x and y are used to determine what + /// quadrant the angle is in. The range of values returned + /// by this function is [-PI, PI]. Results are undefined + /// if x and y are both 0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL atan man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec atan(vec const& y, vec const& x); + + /// Arc tangent. Returns an angle whose tangent is y_over_x. + /// The range of values returned by this function is [-PI/2, PI/2]. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL atan man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec atan(vec const& y_over_x); + + /// Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2 + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL sinh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec sinh(vec const& angle); + + /// Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2 + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL cosh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec cosh(vec const& angle); + + /// Returns the hyperbolic tangent function, sinh(angle) / cosh(angle) + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL tanh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec tanh(vec const& angle); + + /// Arc hyperbolic sine; returns the inverse of sinh. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL asinh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec asinh(vec const& x); + + /// Arc hyperbolic cosine; returns the non-negative inverse + /// of cosh. Results are undefined if x < 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL acosh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec acosh(vec const& x); + + /// Arc hyperbolic tangent; returns the inverse of tanh. + /// Results are undefined if abs(x) >= 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL atanh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec atanh(vec const& x); + + /// @} +}//namespace glm + +#include "detail/func_trigonometric.inl" diff --git a/NothinFancy/dep/include/glm/vec2.hpp b/NothinFancy/dep/include/glm/vec2.hpp new file mode 100644 index 0000000..cd4e070 --- /dev/null +++ b/NothinFancy/dep/include/glm/vec2.hpp @@ -0,0 +1,14 @@ +/// @ref core +/// @file glm/vec2.hpp + +#pragma once +#include "./ext/vector_bool2.hpp" +#include "./ext/vector_bool2_precision.hpp" +#include "./ext/vector_float2.hpp" +#include "./ext/vector_float2_precision.hpp" +#include "./ext/vector_double2.hpp" +#include "./ext/vector_double2_precision.hpp" +#include "./ext/vector_int2.hpp" +#include "./ext/vector_int2_sized.hpp" +#include "./ext/vector_uint2.hpp" +#include "./ext/vector_uint2_sized.hpp" diff --git a/NothinFancy/dep/include/glm/vec3.hpp b/NothinFancy/dep/include/glm/vec3.hpp new file mode 100644 index 0000000..f5a927d --- /dev/null +++ b/NothinFancy/dep/include/glm/vec3.hpp @@ -0,0 +1,14 @@ +/// @ref core +/// @file glm/vec3.hpp + +#pragma once +#include "./ext/vector_bool3.hpp" +#include "./ext/vector_bool3_precision.hpp" +#include "./ext/vector_float3.hpp" +#include "./ext/vector_float3_precision.hpp" +#include "./ext/vector_double3.hpp" +#include "./ext/vector_double3_precision.hpp" +#include "./ext/vector_int3.hpp" +#include "./ext/vector_int3_sized.hpp" +#include "./ext/vector_uint3.hpp" +#include "./ext/vector_uint3_sized.hpp" diff --git a/NothinFancy/dep/include/glm/vec4.hpp b/NothinFancy/dep/include/glm/vec4.hpp new file mode 100644 index 0000000..c6ea9f1 --- /dev/null +++ b/NothinFancy/dep/include/glm/vec4.hpp @@ -0,0 +1,15 @@ +/// @ref core +/// @file glm/vec4.hpp + +#pragma once +#include "./ext/vector_bool4.hpp" +#include "./ext/vector_bool4_precision.hpp" +#include "./ext/vector_float4.hpp" +#include "./ext/vector_float4_precision.hpp" +#include "./ext/vector_double4.hpp" +#include "./ext/vector_double4_precision.hpp" +#include "./ext/vector_int4.hpp" +#include "./ext/vector_int4_sized.hpp" +#include "./ext/vector_uint4.hpp" +#include "./ext/vector_uint4_sized.hpp" + diff --git a/NothinFancy/dep/include/glm/vector_relational.hpp b/NothinFancy/dep/include/glm/vector_relational.hpp new file mode 100644 index 0000000..a0fe17e --- /dev/null +++ b/NothinFancy/dep/include/glm/vector_relational.hpp @@ -0,0 +1,121 @@ +/// @ref core +/// @file glm/vector_relational.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions +/// +/// @defgroup core_func_vector_relational Vector Relational Functions +/// @ingroup core +/// +/// Relational and equality operators (<, <=, >, >=, ==, !=) are defined to +/// operate on scalars and produce scalar Boolean results. For vector results, +/// use the following built-in functions. +/// +/// In all cases, the sizes of all the input and return vectors for any particular +/// call must match. +/// +/// Include to use these core features. +/// +/// @see ext_vector_relational + +#pragma once + +#include "detail/qualifier.hpp" +#include "detail/setup.hpp" + +namespace glm +{ + /// @addtogroup core_func_vector_relational + /// @{ + + /// Returns the component-wise comparison result of x < y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see GLSL lessThan man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec lessThan(vec const& x, vec const& y); + + /// Returns the component-wise comparison of result x <= y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see GLSL lessThanEqual man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec lessThanEqual(vec const& x, vec const& y); + + /// Returns the component-wise comparison of result x > y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see GLSL greaterThan man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec greaterThan(vec const& x, vec const& y); + + /// Returns the component-wise comparison of result x >= y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see GLSL greaterThanEqual man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec greaterThanEqual(vec const& x, vec const& y); + + /// Returns the component-wise comparison of result x == y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point, integer or bool scalar type. + /// + /// @see GLSL equal man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(vec const& x, vec const& y); + + /// Returns the component-wise comparison of result x != y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point, integer or bool scalar type. + /// + /// @see GLSL notEqual man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y); + + /// Returns true if any component of x is true. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL any man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR bool any(vec const& v); + + /// Returns true if all components of x are true. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL all man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR bool all(vec const& v); + + /// Returns the component-wise logical complement of x. + /// /!\ Because of language incompatibilities between C++ and GLSL, GLM defines the function not but not_ instead. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL not man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec not_(vec const& v); + + /// @} +}//namespace glm + +#include "detail/func_vector_relational.inl" diff --git a/NothinFancy/dep/include/stb_image.h b/NothinFancy/dep/include/stb_image.h new file mode 100644 index 0000000..d60371b --- /dev/null +++ b/NothinFancy/dep/include/stb_image.h @@ -0,0 +1,7897 @@ +/* stb_image - v2.27 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine Simon Breuss (16-bit PNM) + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko github:mosra + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + Jacko Dirks + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data) +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// on most compilers (and ALL modern mainstream compilers) this is threadsafe +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// as above, but only applies to images loaded on the thread that calls the function +// this function is only available if your compiler supports thread-local variables; +// calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS + #if defined(__cplusplus) && __cplusplus >= 201103L + #define STBI_THREAD_LOCAL thread_local + #elif defined(__GNUC__) && __GNUC__ < 5 + #define STBI_THREAD_LOCAL __thread + #elif defined(_MSC_VER) + #define STBI_THREAD_LOCAL __declspec(thread) + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) + #define STBI_THREAD_LOCAL _Thread_local + #endif + + #ifndef STBI_THREAD_LOCAL + #if defined(__GNUC__) + #define STBI_THREAD_LOCAL __thread + #endif + #endif +#endif + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +#ifdef _MSC_VER +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS +#define STBI_MAX_DIMENSIONS (1 << 24) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + int callback_already_read; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + int ch; + fseek((FILE*) user, n, SEEK_CUR); + ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ + if (ch != EOF) { + ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user) || ferror((FILE *) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__pnm_is16(stbi__context *s); +#endif + +static +#ifdef STBI_THREAD_LOCAL +STBI_THREAD_LOCAL +#endif +const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} +#endif + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ + ? stbi__vertically_flip_on_load_local \ + : stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + // test the formats with a very explicit header first (at least a FOURCC + // or distinctive magic number first) + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #else + STBI_NOTUSED(bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + + // then the formats that can end up attempting to load with just 1 or 2 + // bytes matching expectations; these are prone to false positives, so + // try them later + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); +#endif + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context *s, int n) +{ + if (n == 0) return; // already there! + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + } + if (n < comp) { + for (i=0; i < x*y; ++i) { + output[i*comp + n] = data[i*comp + n]/255.0f; + } + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (stbi_uc) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & (sgn - 1)); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc * (1 << j->succ_low)); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * (1 << shift)); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0]*4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for (i=0; i < s->img_n; ++i) { + if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); + if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + if (x == 255) { + j->marker = stbi__get8(j->s); + break; + } + } + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + } else { + if (!stbi__process_marker(j, m)) return 0; + } + m = stbi__get_marker(j); + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__errpuc("outofmem", "Out of memory"); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__err("outofmem", "Out of memory"); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + if (!j) return stbi__err("outofmem", "Out of memory"); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static int stbi__zeof(stbi__zbuf *z) +{ + return (z->zbuffer >= z->zbuffer_end); +} + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + return stbi__zeof(z) ? 0 : *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + if (z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s >= 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! + if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) { + if (stbi__zeof(a)) { + return -1; /* report error for unexpected end of data. */ + } + stbi__fill_bits(a); + } + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + unsigned int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (unsigned int) (z->zout - z->zout_start); + limit = old_limit = (unsigned) (z->zout_end - z->zout_start); + if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); + while (cur + n > limit) { + if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); + limit *= 2; + } + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + } else if (c == 18) { + c = stbi__zreceive(a,7)+11; + } else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + if (img_width_bytes > x) return stbi__err("invalid width","Corrupt PNG"); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; + } + #undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + // insert alpha = 255 + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if (!final) return stbi__err("outofmem", "Out of memory"); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_global = flag_true_if_should_convert; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi__unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ + ? stbi__unpremultiply_on_load_local \ + : stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ + ? stbi__de_iphone_flag_local \ + : stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]={0}; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); + s->img_y = stbi__get32be(s); + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth <= 8) + ri->bits_per_channel = 8; + else if (p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) { n += 16; z >>= 16; } + if (z >= 0x00100) { n += 8; z >>= 8; } + if (z >= 0x00010) { n += 4; z >>= 4; } + if (z >= 0x00004) { n += 2; z >>= 2; } + if (z >= 0x00002) { n += 1;/* >>= 1;*/ } + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; + int extra_read; +} stbi__bmp_data; + +static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) +{ + // BI_BITFIELDS specifies masks explicitly, don't override + if (compress == 3) + return 1; + + if (compress == 0) { + if (info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } else if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + info->extra_read = 14; + + if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + stbi__bmp_set_mask_defaults(info, compress); + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + // V4/V5 header + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - info.extra_read - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if (psize == 0) { + if (info.offset != s->callback_already_read + (s->img_buffer - s->img_buffer_original)) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } + } + + if (info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - info.extra_read - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i]; p1[i] = p2[i]; p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + if (tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED(tga_palette_start); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + if (!result) return stbi__errpuc("outofmem", "Out of memory"); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!g) return stbi__err("outofmem", "Out of memory"); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *) stbi__malloc(4 * pcount); + g->background = (stbi_uc *) stbi__malloc(4 * pcount); + g->history = (stbi_uc *) stbi__malloc(pcount); + if (!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if (w == 0) + g->cur_y = g->max_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (!o) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) +{ + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if (out) STBI_FREE(out); + if (delays && *delays) STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); + if (!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); + else { + out = (stbi_uc*) tmp; + out_size = layers * stride; + } + + if (delays) { + int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); + if (!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + if (!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } else if (g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + if (p == NULL) { + stbi__rewind( s ); + return 0; + } + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) { + if (info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if (ri->bits_per_channel == 0) + return 0; + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8)); + + if (req_comp && req_comp != s->img_n) { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + if (maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if (maxv > 255) + return 16; + else + return 8; +} + +static int stbi__pnm_is16(stbi__context *s) +{ + if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_is16(s)) return 1; + #endif + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +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. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +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 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/NothinFancy/dep/lib/freetype.lib b/NothinFancy/dep/lib/freetype.lib new file mode 100644 index 0000000000000000000000000000000000000000..bbfaf4c94a2008e7bb1966c380c4b70465b421fc GIT binary patch literal 3689862 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�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�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